Как дизайн, чтобы избежать литья - PullRequest
0 голосов
/ 17 января 2019

Я разрабатываю программное обеспечение для отображения объектов ModelView на основе DataModel.

DataModel отображается объектом ModelView, который сам может содержать группу объектов ViewObject. Это похоже на контейнер ViewObjects, который представляет собой ModelView и, наконец, отображает DataModel.

Эти объекты ViewObject могут зависеть друг от друга внутри ModelView, поэтому, например, положение одного объекта ViewObject может зависеть от другого.

Затем также определяется макет окончательного экрана на основе всех ModelView.

Эти ViewObject наследуются от общего класса BaseView, но клиент может просто добавлять новые типы ViewObject в иерархию, наследуя от класса BaseView. Эти производные классы могут иметь специальные функции, которые могут быть вызваны для соединения их вместе в ModelView.

Не могли бы вы, кто-нибудь, дать мне идею, как сделать это без динамического приведения?

РЕДАКТИРОВАТЬ: я определил следующий класс:

class EventView // ModelView class containing
{
private:
    //Pointer to BaseViews constituting to ModelView
    std::shared_ptr<BaseView> m_FlowView;   
    std::shared_ptr<BaseView> m_SourceView;
    std::shared_ptr<BaseView> m_TargetView;
    std::shared_ptr<BaseView> m_WorkerView;
    std::shared_ptr<TEvent> m_Model;
}

Клиент может наследовать от BaseView, что BaseView может быть линией или окружностью, кривой или чем-то еще. Следовательно, они могут быть совершенно разными. С моей точки зрения, мне нужен всего лишь список объектов BaseView, чтобы нарисовать их, но клиентский код отвечает за их взаимосвязь и размещение. Но так как я буду хранить только указатели BaseView, клиент может нуждаться в понижении для соединения элементов.

1 Ответ

0 голосов
/ 17 января 2019

Из того, что я понимаю из вашего вопроса, вы храните базовые указатели объектов, но извне вы хотите работать с ними как с производными объектами.

В этом случае крайне важно понизить рейтинг.

Хотя ваш вопрос неопределенный, я вижу вашу ситуацию очень похожей на элемент управления в диалоговом окне, где оба окна являются окнами, но говорят, что CheckBox - это специализированное окно, над которым вы хотите работать, в частности, с расширенными функциями.

Основные рамки используют литье для этой проблемы, как MFC здесь .

В новой платформе Qt также используется приведение, как в findChildren .

Я надеюсь, что вы сможете оценить свое решение, учитывая эту информацию, и, возможно, помириться с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...