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