Наследование иерархии

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

Изображение

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

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

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

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

Итак, у меня есть одно дерево иерархии для элементов управления 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). Абстрактное дерево имеет только абсолютные абстрактные методы. Все наследование в абстрактном дереве виртуально. Связь от дерева реализаций к абстрактному виртуальна. На изображении для простоты показано только одно дерево реализаций.
Спасибо за помощь!


person Eugene    schedule 10.11.2010    source источник
comment
Было бы полезно видеть значимые имена вместо FirstBase, FirstItem, SecondBase и т. Д.   -  person Marcelo Cantos    schedule 10.11.2010
comment
В чем причина наличия AbstractItem? Почему бы просто не иметь класс AbstractBase, являющийся общим якорем не только для FirstBase и SecondBase, но также для FirstItem и SecondItem?   -  person Doc Brown    schedule 10.11.2010
comment
Если ваши объекты имеют одинаковое поведение и одинаковый интерфейс, они должны быть одного класса.   -  person Björn Pollex    schedule 10.11.2010
comment
Вы не можете проектировать абстрактно. Единственный способ создать разумную иерархию - это знать, что это за классы есть и что они делают. и вы не говорите нам об этом, поэтому мы не сможем вам помочь.   -  person jalf    schedule 10.11.2010


Ответы (3)


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

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

person Marcelo Cantos    schedule 10.11.2010

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

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

person Steve Townsend    schedule 10.11.2010

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

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

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

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

person Stephane Rolland    schedule 10.11.2010