2011-10-12 2 views
0

У меня есть 3-х классов, A, B и C где B является A и C является A.Multiple реализация дизайн наследования

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

Теперь неожиданно необходимо получить информацию от A, B и C в одном классе, и я не уверен в лучшем подходе.

Я думал о создании нового класса D, который наследуется от B и C, и изменения их наследования virtual public A, чтобы избежать diamond problem и есть D::archive() просто позвонить B::archive() и C::archive().

Это хороший подход? Или мне нужно переделать 4 класса, чтобы я не использовал множественное наследование?

+0

«Теперь внезапно возникает необходимость иметь информацию из A, B и C в одном классе» - это корень зла. Что именно вы пытаетесь достичь? –

+0

Информация в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Но, конечно, через пару лет, у кого-то появилась «крутая» идея в голове, и интерфейс не работает, поэтому я пытаюсь найти лучший способ изменить это. – steveo225

+0

Трудно рассуждать об этом абстрактно. В целом вы можете рассматривать композицию как альтернативу наследованию, но это зависит от специфики. MI может быть хорошим, когда это уместно. –

ответ

5

Ваш подход является стандартным. C++ имеет множественное наследство, и вы можете свободно использовать его. Похоже, вы знаете, как это сделать правильно.

+0

Это облегчение, чтобы услышать. Я стараюсь избегать множественного наследования настолько, насколько могу, и потребовалось некоторое время, чтобы правильно понять этот подход, поэтому я хотел удостовериться, что я не пропустил, прежде чем модифицировать весь код. – steveo225

+0

Кстати, другие предложенные подходы также действительны, но я предполагаю, что вам нужна иерархия для полиморфизма и не хочу, чтобы все это изменилось только для этого. Начиная с нуля, вы можете вместо этого использовать интерфейсные микшины (и состав для повторного использования кода), но то, что вы рассматриваете, тоже в порядке. –

5

Как насчет использования композиции вместо этого?
E.g. class D делегаты классам B и C вместо наследования.
Композиция может достичь тех же результатов и код намного проще (ИМХО)

0

Вы могли бы D, полученный из A, содержащий два элемента B и C. D :: архив назовет B :: архив и C :: Архив

1

Остерегайтесь цепи вызова конечные главенствующими методы могут иметь: если B::method звонки A::method и C::method звонки A::method, когда вы кладете их в D, что делает виртуальный, если D::method вызовы как C::method и B::method, вы получите A::method называется дважды.

Когда база сделана виртуальной, вы должны избегать таких повторных попыток.

+0

+1 Это хорошая точка – steveo225

Смежные вопросы