如何避免语义耦合以创建可重用的显示引擎
How can I avoid semantic coupling to create a reusable display engine?
DisplayEngine 有一个 DisplayableObject 列表。 每个 DisplayableObject 派生类使用不同的数据集。 因此,我为数据创建了一个基类,以便我可以将 BaseData 传递到每个 DisplayableObject 的更新中,而无需了解 DisplayableObject 和 BaseData 的派生类。 然后在每个派生的 DisplayableObject 更新函数中,我转换为正确类型的数据。
问题是这是一个语义耦合。 如果我将错误的派生数据类传递给派生的 DisplayableObject 类之一,这就会爆炸,实际上更新函数真的无法像外面那样处理所有 BaseData 类。
本质上,这里发生的事情是模块 1 将 BaseObject 传递给模块 2。因为模块 2 知道模块 2 实际上是在传递 DerivedObject,所以它会将 BaseObject 强制转换为 DerivedObject,并使用特定于 DerivedObject 的数据。
问题是,我想不出其他方法可以做到这一点。 如何获得一个 DisplayableObjects 列表,每个对象都采用不同的数据集,并且让 DisplayEngine 对任何派生类一无所知,以便我可以在另一个项目中重用 DisplayEngine?
这有点复杂,所以提前感谢您查看它。
Class DisplayEngine{
DisplayableObject displayableObjectsList[10];
BaseData *dataList[10];
// Each element in data list is updated somewhere else.
void UpdateAll(){
for(int i=0; i<10; i++){
displayableObjectsList[i].Update(dataList[i]);
}
}
}
Class DisplayableObject{
virtual void Update(BaseData bData);
}
Class BaseData {
//empty.
}
Class Data1 : BaseData{
String b;
}
Class Data2: BaseData{
int a;
}
Class DisplayableObject1: DisplayableObject{
void Update(BaseData bData){
Data1* d = (Data1*) bData;
//Do Work with d, can use d.b
}
}
Class DisplayableObject2: DisplayableObject{
void Update(BaseData bData){
Data2* d = (Data2*) bData;
//Do Work with d, can use d.a
}
}
尝试使用访客模式。你可以在这里阅读所有关于它的信息
如果您有更多问题或需要更多示例,请随时提问。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- Unity在虚幻引擎4中的"Vector3.Slerp"等效C++?
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 自动测试不会显示在会话前端中。虚幻引擎
- GamePlay3d 引擎不会显示从 fbx 导入的模型
- 如何避免语义耦合以创建可重用的显示引擎