2012-06-07 5 views
0

Я занимаюсь разработкой API, в котором класс А, производный как класс B.Как заменить базовый класс с производной базового класса

если пользователь API хотят расширить функциональные возможности обоих классов А и класса B в уровень приложения, тогда будет проблема.

Предположим, что пользователь приложения имеет класс AX, расширяющий класс A, и класс BX, расширяющий класс B. В этом случае пользователь не получает ожидаемое поведение для класса BX, так как базовый класс класса Bs является классом NOT класса AX.

Мысль: пользователь приложения может расширить класс BX, используя как класс B, так и класс AX, но в этом случае я думаю, что будет известно поведение алмазов.

Я хотел бы знать, любой стандартный способ решения этой проблемы.

+0

Я бы предложил избегать наследования и вместо этого использовать какую-то инъекцию зависимостей (A получает объект A, B получает объект A и B), внешние пользователи определяют отображение A 'на AX и B' на BX - - проблема решена) – Cameron

ответ

1

Класс, наследующий параметр шаблона, также является опцией. Псевдо-код:

class A; 

template<typename WhichA> 
class B : public WhichA; 

class AX : public A; 

class BX : public B<AX>; 
1

Ваш вопрос немного расплывчатый. Во всяком случае, я бы рекомендовал вам прочитать, в частности, C++ FAQ 25 и Question 25.5. Вопросы 25.5 и 25.6 обсуждают некоторые альтернативы.

+0

Мой класс B разделяет большую часть реализации класса A, поэтому требуется несколько переопределений методов для реализации дополнительных функций в классе B. В этом виде сценария мы можем избежать наследования? Я хотел бы проигнорировать предложенный шаблон. – nimoz

0

... но в этом случае я думаю, что будет известно поведение алмазов

Так в чем проблема? virtual Наследование предназначено для разрешения такого алмазного рисунка.
Если дети A фактически унаследованы, то я не вижу никаких проблем, если дизайн не будет изменен.

0
class InterfaceA; 

class InterfaceB; 

class A : public InterfaceA; 

template<class AType> 
class B_Template : public InterfaceB, public AType; 

// Below is same as class B in example 
// Users can use B as if it was class B 
typedef B_Template<A> B; 

// User can extend A 
class AX : A; 

// User can extend B any way they want (you can't police this) 
// but the way you wanted in the question was: 
class BX : B_Template<AX>; // Inherits of the extended AX 

Это решает ваш вопрос, но, как указано в комментариях, вы должны рассмотреть вопрос о зависимости инъекции вместо наследования.

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

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