Идиомы и стили С++ | страница 14



>public:

> CInterface (CComplexObject _co){}; // Это конструктор

>};

Немного подумав, решаем перенести обязанности по порождению интерфейсов на объект. Конструктор интерфейса перекладываем в private, объявляем класс объекта дружественным классу интерфейса, в классе объекта перегружаем операторы преобразования (или русским языком говоря - рисуем операторы преобразования объекта к интерфейсу).

>// Это объект

>class CComplexObject {

> operator CInterface() { return new CInterface(this); } // оператор преобразования

>};


>// Это интерфейс

>CInterface {

>private:

> CComplexObject* co; // Укаэатель на объект

> CInterface (CComplexObject* _co) {} // Это частный конструктор

>};

Думаем еще раз: перенести ответственность за преобразование интерфейсов на специально выделенный smart-указатель, и временно назовем его Super-указателем. Идея с супером просто счастливая - мало того, что не надо изменять объект (код класс объекта), так еще и преобразование упрощается: сначала получим супер по интерфейсу, а потом другой интерфейс по суперу. Да, конечно, два преобразования подряд, но это все же лучше чем в каждом интерфейсе определять преобразование ко всем остальным. Зато интерфейсы ничего не знают друг о друге, им нет нужды, если им известен супер. И потом, поскольку интерфейсы являются простыми smart-ами, надо пожалуй задать функциюшечку, которая бы проверяла - есть ли вообще в природе изрядно подзабытый нами объект. Это место небезуспешно может занять перегруженный оператор operator!().

>// Предварительные объявления классов

>class CComplexObject;

>class CInterface;

>class CSuperObject;


>// Определение объекта пропускаю, это Ваше занятие.

>// Определение супера

>class CSuperObject {

>private:

> CComplexObject* co; // указатель на объект

>public:

> // конструктор супера,

> CSuperObject(CComplexObject* _co): co(_co) {}

> // Живой ли наш объект? Дима! Помаши рукой маме!

> bool operator!(){ return co==NULL; }

> // преобразование к интерфейсу

> operator CInterface();

>}


>// Это интерфейс

>CInterface {

>private:

> CComplexObject* co; // Укаэатель на объект

> CSuperObject* cs; // указатель на супер

> CInterface (CComplexObject* _co) {} // Это частный конструктор

>public:

> bool operator!(){ return co==NULL; } //проверка на существование объекта

> operator CSuperObject (); //преобразование к суперу

>};

Ну все, с этой темой я закругляюсь, но думаю, что идея понятна. Комбинации умных, ведущих, интерфейсных указателей, наследование смартов от абстрактных базовых классов, наследование смартов и указываемых объектов от одних и тех же базовых классов позволяют Вам достичь удивительной гибкости. Помните, как Шалтай-Болтай говорил Алисе "с таким именем ты можешь оказаться кем угодно… просто КЕМ УГОДНО!"? Мы лучше. Мы оказываемся кем угодно, когда угодно, и по собственному желанию.