- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下设计:
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
共享一些公共(public)数据,因此创建了RawDataBase
作为基类。从 MessageBase
派生的 MessageA
和 MessageB
也是如此。
然后,在MessageBase
中添加一个虚拟的Decode
函数,以RawDataBase
对象作为参数。但是 MessageA
中有一些问题 和 MessageB
。对于 MessageA
,参数实际上应该始终是 RawDataA
,因此必须在此处进行向下转换。但是有人说必须在代码中使用向下转换时一定存在设计问题。
所以我的问题是如何设计这里的代码以避免向下转换?
谢谢!
最佳答案
这里为了避免向下转换:
class MessageA : public MessageBase {
virtual void Decode(RawDataBase *raw) { ...}
}
你的代码必须变成这样:
class MessageA : public MessageBase {
virtual void Decode(RawDataA *raw) { ...}
}
这意味着 MessageBase
必须以某种方式变成:
class MessageBase {
virtual void Decode(RawDataA *raw){...}
}
这可以使用这样的模板来完成:
class RawDataBase { /* ... */ };
class RawDataA : public RawDataBase { /* ... */ };
class RawDataB : public RawDataBase { /* ... */ };
template<typename T>
class MessageBase {
using RawDataType = T;
// ...
virtual void Decode(RawDataType *raw){/* ... */}
// ...
};
class MessageA : public MessageBase<RawDataTypeA> {
// ...
virtual void Decode(RawDataType *raw){/* ... */}
// ...
};
class MessageB : public MessageBase<RawDataTypeB> {
// ...
virtual void Decode(RawDataType *raw){/* ... */}
// ...
};
关于c++ - 使用多态时如何避免向下转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45608133/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!