0

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

1 回答 1

0

尝试使用访客模式。你可以在这里阅读所有相关信息

如果您有更多问题或需要更多示例,请随时提问。

于 2013-10-15T15:57:02.473 回答