Как я могу избежать семантической связи для создания многоразового механизма отображения?

DisplayEngine имеет список объектов DisplayableObject. Каждый производный класс DisplayableObject использует свой набор данных. Итак, я создал базовый класс для данных, чтобы я мог передавать BaseData в обновление для каждого DisplayableObject, не зная ничего о производных классах DisplayableObject и BaseData. Затем в каждой производной функции обновления DisplayableObject я приводил данные нужного типа.

Проблема в том, что это семантическая связь. Если я передаю неправильный производный класс данных одному из производных классов DisplayableObject, это взрывается, и функция обновления действительно НЕ МОЖЕТ обрабатывать ВСЕ классы BaseData, как это выглядит снаружи.

По сути, здесь происходит то, что Module1 передает BaseObject в Module2. Поскольку Module2 знает, что Module2 действительно передает ему DerivedObject, он преобразует BaseObject в DerivedObject и использует данные, специфичные для DerivedObject.

Проблема в том, что я не могу найти способ сделать это каким-либо другим способом. Как я могу получить список объектов DisplayableObject, каждый из которых принимает различный набор данных, а 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
}
}

0

Решение

Попробуйте использовать шаблон посетителя.
Вы можете прочитать все об этом Вот

Если у вас есть дополнительные вопросы или вам нужен дополнительный пример, не стесняйтесь спрашивать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]