архитектура и множественное наследование - PullRequest
0 голосов
/ 12 октября 2018

Я обнаружил проблему множественного наследования при разработке архитектуры моей программы.

У меня есть несколько различных объектов, которые должны отображаться в форме графического интерфейса. Я предпочел наследование от класса Widget , чтобы избежать реализации методов, подобных показанным ниже (методы show, hide, setEnabled, move и т. Д., Которые можно использовать в анимации):

void Device::show()
{
    this->widget->show();
}

void Device::hide()
{
    this->widget->hide();
}

// etc...

Ну, я разделил все объекты на две группы:

  • Контейнеры (просто для хранения чего-то, у него есть номер и информация о его содержимом)
  • Устройства (реальное устройство с напряжением, кодами состояния, предупреждениями, ошибками и т. д.)

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

Я думал о:

  • с использованием интерфейсов , но каждый класс, реализующийИнтерфейс должен реализовывать методы интерфейса.И это не очень хороший способ до ctrl+c, ctrl+v всего кода обработки ошибок (поскольку он одинаков для всех объектов) во всех классах, реализующих интерфейс ErrorAble или WarningAble.Завтра кто-нибудь скажет мне: «Добавьте новый код ошибки» ... И я должен сказать ему ... внести изменения во все классы.
  • сделать один базовый класс, но это поражает логикой, когда объект "бутылка" (контейнер) будет иметь напряжение, коды ошибок, предупреждения (как устройство).

И я должен сделать что-то с архитектурой.Но я понятия не имею, что делать.Может ли кто-нибудь предложить мне что-нибудь?

enter image description here

1 Ответ

0 голосов
/ 16 октября 2018

Я решил проблему с перемещением Device и Container на один уровень с Widget в иерархии объектов, и теперь они не наследуются от Widget.В результате, если объект является одновременно устройством и контейнером, определение класса выглядит следующим образом:

class SomeObject : public Widget, public Device, public Container
{ /* ... */ };

Это помогает мне избежать наследования алмазов , потому что Device и Container не имеют родителей.

Также: Я отказался использовать композицию , что было предложено в комментариях, потому что:

  1. Device нетчасть SomeObject.
  2. SomeObject является одним из возможных устройств .
  3. SomeObject является одним из возможных виджетов .
  4. SomeObject - это один из возможных контейнеров .

Что я получил : методы контейнера / устройства определены и реализованы только один раз вмоя программа (например, сеттеры и геттеры для свойств контейнера) и все их дочерние объекты могут использовать их из поля без делегирования.

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