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
}
}