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

0

В 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
    }
}
Теги:
code-reuse

1 ответ

0

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

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

  • 0
    Благодарю за ваш ответ. Я не слышал о шаблоне посетителей раньше, и это очень интересно, хотя я не уверен, что он будет работать здесь. В этом шаблоне посетитель должен реализовать метод для каждого типа элемента. В моем случае мой список displayableObjects не должен делать что-то свое с каждым производным типом baseData, он имеет дело только с одним из них. Каждый displayableObject будет отображать данные из одного класса производных данных baseData. Я могу, однако, быть в состоянии использовать некоторые концепции в шаблоне посетителей в решении здесь, мне придется потратить больше времени с ним. Еще раз спасибо!
  • 0
    Просто реализуйте пустую реализацию в базе и переопределите единственный метод, который обрабатывает ваш конкретный тип данных.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню