【发布时间】:2013-10-23 12:22:48
【问题描述】:
DisplayEngine 有一个 DisplayableObjects 列表。每个 DisplayableObject 派生类使用不同的数据集。因此,我为数据创建了一个基类,这样我就可以将 BaseData 传递到每个 DisplayableObject 的更新中,而无需了解有关 DisplayableObject 和 BaseData 派生类的任何信息。然后在每个派生的 DisplayableObject 更新函数中,我转换为正确的数据类型。
问题在于这是一种语义耦合。如果我将错误的派生数据类传递给派生的 DisplayableObject 类之一,这就会崩溃,而且更新函数真的不能像在外部看到的那样处理所有 BaseData 类。
基本上这里发生的事情是 Module1 将 BaseObject 传递给 Module2。因为 Module2 知道 Module2 确实传递给它 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
}
}
【问题讨论】:
标签: c++ code-reuse coupling