Понадобилось мне сегодня
вынести мозг сделать так, чтобы наследный класс в некоторой иерархии скрывал часть методов интерфейса родителя. Т.е. для кода, который с родителем работает - чтоб все было как прежде, а вот тот код, который с дитем связан, видеть этого кошмара не должен. Ну или должен видеть только часть интерфейса из родительской иерархии. Да, можно было бы отправить часть в private. Однако тогда у нас будет скрыт не интерфейс, а реализация метода и через тот же интерфейс можно будет до реализации достучаться.
Пример ситуацииclass Parent {
public:
virtual void visible () = 0;
virtual void hidden () = 0;
};
class Child : public Parent {
public:
virtual void visible () { /*...*/ }
private:
virtual void hidden () { /*...*/ }
};
Child child;
Parent & parent = child;
parent.visible(); // ОК
child.visible(); // ОК
parent.hidden(); // ОК
child.hidden(); // BOOM!!! Unaccessible!
Можно попробовать в некотором классе иерархии (не корневом, т.к. надо только на 1 подкласс) обьявить скрываемый метод невиртуальным, но толку от этого все равно не будет, если в корневом классе метод объявлен виртуальным.
В результате народилась следующая идея:
Идея, надо отметить, совершенно не новая. Адаптер в его чистом виде. Скрываемые вызовы перехватываются в классе Adaptive, остальные - банально делегируются классу Adapter, где они при необходимости уходят в реализацию классов-наследников вроде Concrete_adapter.
Adaptive сделан внутренним классом, чтоб никто до него не достучался извне, ибо его задача - исключительно делегировать вызовы по виртуальным методам.