В DisplayEngine есть список объектов DisplayableObjects. Каждый производный класс DisplayableObject использует другой набор данных. Поэтому я создал базовый класс для данных, чтобы передать BaseData в обновление для каждого объекта DisplayableObject без необходимости знать что-либо о производных классах DisplayableObject и BaseData. Затем в каждой производной функции отображения DisplayableObject я передаю правильный тип данных.
Проблема в том, что это семантическая связь. Если я передаю неправильный производный класс данных в один из выведенных классов DisplayableObject, это взрывается, и действительно функция обновления действительно CANT обрабатывает ВСЕ классы 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
}
}
Попробуйте использовать шаблон посетителя. вы можете прочитать все об этом здесь
если у вас больше вопросов или вам нужен дополнительный пример, не стесняйтесь спрашивать.