如何避免语义耦合以创建可重用的显示引擎

How can I avoid semantic coupling to create a reusable display engine?

本文关键字:显示 引擎 创建 何避免 语义 耦合      更新时间:2023-10-16

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

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

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