考虑下面的设计:如何在使用多态性时避免下滑?
class RawDataBase
{
private:
std::string data;
};
class RawDataA : public RawDataBase
{
private:
int spec_data_for_a1;
int spec_data_for_a2;
};
class RawDataB : public RawDataBase
{
private:
int spec_data__for_b;
};
class MessageBase
{
private:
int x;
int y;
int z;
public:
virtual void Decode(RawDataBase *raw)
{
// extract x,y,z from raw.data
}
};
class MessageA : public MessageBase
{
private:
int spec_data_for_a1;
int spec_data_for_a2;
public:
/* Here raw must be RawDataA*/
virtual void Decode(RawDataBase *raw)
{
MessageBase::Decode(raw);
RawDataA raw_data = static_cast<RawDataA*>(raw);
// extract spec_data_for_a1, spec_data_for_a2 from raw_data
}
};
class MessageB : public MessageBase
{
private:
int spec_data__for_b;
public:
/* Here raw must be RawDataB*/
virtual void Decode(RawDataBase *raw)
{
MessageBase::Decode(raw);
RawDataB raw_data = static_cast<RawDataB*>(raw);
// extract spec_data__for_b from raw_data
}
};
我有一个设计问题,而解码RawData
到Message
。
RawData
(RawDataA
& RawDataB
)有两种类型。 RawDataA
将被解码为MessageA
,而RawDataB
将被解码为MessageB
。 RawDataA
和RawDataB
都共享一些常用数据,因此RawDataBase
被创建为基类。 同样适用于MessageA
和MessageB
,源自。
然后,将一个虚拟Decode
函数添加到中,以RawDataBase
对象作为参数。但在MessageA
和MessageB
中有一些问题。对于MessageA
,参数实际上应该始终为RawDataA
,因此必须在此完成压铸。但是有人说,在代码中使用下拉式演员时必定存在一些设计问题。
所以我的问题是如何设计这里的代码,以避免羽绒被?
谢谢!
'模板'似乎比继承在这里更好分解代码。 – Jarod42
你是否也指CRTP?或其他解决方案。谢谢! – xYZ
不需要CRTP,一个简单的模板类。 – Jarod42