【发布时间】:2018-01-18 08:58:06
【问题描述】:
考虑以下设计:
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 被创建为基类。
派生自MessageBase 的MessageA 和MessageB 也是如此。
然后,将一个虚拟的Decode 函数添加到MessageBase 中,以RawDataBase 对象为参数。但是MessageA有问题
和MessageB。对于MessageA,参数实际上应该总是RawDataA,所以这里必须进行向下转换。但是有人说,当必须在代码中使用向下转换时,肯定存在一些设计问题。
所以我的问题是如何设计这里的代码以避免向下转换?
谢谢!
【问题讨论】:
-
template在这里分解代码似乎比继承更好。 -
你也是指 CRTP 吗?或其他解决方案。谢谢!
-
不需要CRTP,一个简单的模板类。
标签: c++ inheritance design-patterns static-cast