Иерархия наследования - PullRequest
0 голосов
/ 10 ноября 2010

Я столкнулся с проблемой. В моем дереве иерархии C ++ у меня есть две ветви для сущностей разной природы, но одно и то же поведение - один и тот же интерфейс. Я создал такие деревья иерархии (сначала на изображении ниже). И теперь я хочу работать с классами Item или Base независимо от их природы (первый или второй). Затем я создаю одну абстрактную ветку для этого использования. Мой разум построить (второй на изображении ниже). Но это не работает. Схема работы кажется (третий на изображении ниже). Это плохая логика, я думаю ... У кого-нибудь есть идеи по поводу такого иерархического наследования? Как сделать это более логичным? Более простой для понимания?

Изображение

Извините за мой англо - русский интернет не помогло:)

Обновление: Вы просите меня быть более явным, и я буду.

В моем проекте (плагины для Adobe Framemaker) мне нужно работать с диалогами и элементами управления GUI. В некоторых местах я работал с элементами управления WinAPI, а в некоторых других местах - с элементами управления FDK (внутренний Framemaker), но я хочу работать с тем же интерфейсом.

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

Итак, у меня есть одно дерево иерархии для элементов управления WinAPI, одно для FDK и одно абстрактное дерево для использования любого элемента управления.

Например, есть элемент управления Edit (реализация WinEdit и FdkEdit), элемент управления Button (реализация WinButton и FdkButton) и базовый объект - Control (реализация WinControl и FdkControl).

На данный момент я могу связать свои классы в деревьях реализации (Win и Fdk) с наследованием между каждым из них (WinControl - базовый класс для WinButton и WinEdit; FdkControl - базовый класс для FdkButton и FdkEdit). И я могу ссылаться на абстрактные классы (Control - базовый класс для WinControl и FdkControl; Edit - базовый класс для WinEdit и FdkEdit; Button - базовый класс для WinButton и FdkButton). Но я не могу связать свое абстрактное дерево - компилятор ругается.

На самом деле у меня есть два дерева иерархии, которые я хочу унаследовать от другого.

Обновление:
Я сделал этот квест! :)
Я использовал виртуальное наследование и получил такую ​​схему (http://img12.imageshack.us/img12/7782/99614779.png). Абстрактное дерево имеет только абсолютные абстрактные методы. Все наследования в абстрактном дереве являются виртуальными. Ссылка от дерева реализации к абстрактному является виртуальной. На изображении для простоты показано только одно дерево реализации.
Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 10 ноября 2010

Из описания не ясно, будет ли это работать для вас, но обычно классы с общим интерфейсом определяют интерфейс в AbstractBase и затем имеют конкретные экземпляры, наследуемые непосредственно от этого (FirstItem, SecondItem).

Почему дополнительные косвенные ссылки в ваших примерах?Что ожидается в AbstractItem, FirstBase и SecondBase?

0 голосов
/ 10 ноября 2010

Для использования разных реализаций одного интерфейса можно использовать: Шаблон проектирования моста

Вы можете связать это с шаблоном Factory Design Pattern, чтобы по-разному конструировать ваши две реализации.

Однако, это может выглядеть слишком просто для вашей архитектуры классов.

Но, как говорится в комментариях под вашим ответом: трудно представить себе работу / роль ваших классов с такими именами. Вы должны быть более явными, чтобы мы могли придумать точный дизайн.

0 голосов
/ 10 ноября 2010

C ++ поддерживает множественное наследование, поэтому вы можете иметь объединение (2) и (3), гарантируя, что AbstractBase всегда объявляется как виртуальный базовый класс.

Не зная истинного значения иЦель различных классов, трудно предложить лучший совет.

...