Каков наилучший способ реализации шаблона адаптера в переполнении стека?

Я видел, что можно использовать наследование, например:

class A {
};

class Legacy{
};

class B : public A, private Legacy {
};

Но мне странно наследовать публичные и приватные от двух разных классов. Есть ли альтернативный способ реализации шаблона адаптера?

0

Решение

Обычно для адаптеров лучше использовать композицию, а не наследование (и во многих других случаях):

class B : public A {
public:
/* implementation of abstract methods of A with calls to Legacy */

private:
Legacy m_leg;
};
2

Другие решения

Здесь вы используете класс Adapter. Использование самого адаптера является компромиссом (мы используем адаптер, когда у нас нет контроля над устаревшим адаптером, но мы все еще хотим его использовать). Для конкретной цели (в соответствии с требуемыми и предоставляемыми интерфейсами) мы вынуждаем Adapter наследоваться от Adaptee, а также Target. Так как такой класс Adapter (страдающий от множественного наследования) не является повторно используемым классом домена в приложении, он является просто (AKA) классом-оболочкой. Его отношения «IsA» с Adaptee, а также с Target являются сильными и не являются естественными для модели предметной области.

Даже в этом случае, как указывает @dlasalle, использование Object Adapter по составу сделает его использование более безопасным. Но выбор зависит от компромисса между обоими типами. например если 80% функциональности Adapter публикуется Adapter как есть, то Class адаптер — хороший выбор, чтобы избежать написания методов-оболочек для всех этих 80%. Реализация C ++ имеет выбор использования адаптера класса (с должной осторожностью), которого нет в Java.

0