C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
как обойти запрет множественного наследования?, попытка применить observer
Tertium
Отправлено: 23.04.2004, 11:16


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



Народ! Очень хочется использовать паттерн observer (gang of 4). Но для этого нужно множественное наследование. Как это можно сделать в проекте с vcl? Ктонть пробовал? Там множественного наследования низя, но может как-то можно это обойти?
olegenty
Отправлено: 23.04.2004, 11:27


Ветеран

Группа: Модератор
Сообщений: 2412



для VCL классов множественное наследование неприменибо, ибо они есть ничто иное, как оболочки для аналогичных классов Delphi, разработанных на Object Pascal, который по определению не поддерживает множественного наследования.

множественное наследование работает только для собственных класов, не порождённых от VCL классов.
Tertium
Отправлено: 23.04.2004, 21:14


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



я в курсе. Я спрашивал, может есть какой типовой trick... Типа через асм или вроде того. А то приходится передавать как void* , а там уже кастить. Но тогда observed видит реальный класс observer'a, а не просто IObserver. Некрасиво как-то.
olegenty
Отправлено: 26.04.2004, 07:33


Ветеран

Группа: Модератор
Сообщений: 2412



вообще-то если реальный класс потомок IObserver, то ты можешь и его из void* получить, следующим образом:

CODE

if (IObserver *p = dynamic_cast<IObserver *>(твой_void))
{
   // используешь p как IObserver
}
Tertium
Отправлено: 26.04.2004, 18:49


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



да нет. я не о том. я знаю как пользоваться с++ smile.gif
вот что нарыл по поводу обхода запрета множ. наследования:
CODE

template <typename T>
class X : public T
{
...
};

template <typename T>
class Y : public T
{
...
};

class Z : public X < Y<TListBox> >
{
...
};

"В данном примере имеем аналог множественного наследования Z от X, Y и TListBox. Изврат конечно, но хоть как-то."
olegenty
Отправлено: 27.04.2004, 10:08


Ветеран

Группа: Модератор
Сообщений: 2412



я сам в таких случаях просто включаю классы, как member, и всё.
но, с визуальными при этом не работал.

да, и что-то мне подсказывает, что вывести этот свой TListBox, вошедший в Z, как контрол, ты всё равно не сможешь...
Tertium
Отправлено: 01.06.2004, 13:50


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



olegenty
давеча испробовал на деле трик с шаблонами.
А вот, представляешь, эта уловка с шаблонами работает. То есть я разделяю смысловую нагрузку и получаю класс, наследованный от TButton и IObserver. Ну, конечно, на самом деле получается наследованный от IObserver<TButton>. Потом их всех под одну гребёнку, тк они потомки TObject anyway smile.gif И бьём по билдеру его же GetClassName и иже с ним, я уже не помню... Короче, вывернулись. Но конечно читабельность у сырцов уже не та... biggrin.gif

Отредактировано Tertium — 01/06/2004, 15:04
Asher
Отправлено: 04.06.2004, 13:28


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Решил внести свои пять копеек wink.gif
QUOTE
"В данном примере имеем аналог множественного наследования Z от X, Y и TListBox. Изврат конечно, но хоть как-то."

Зачем сразу изврат...
Стандартный способ, описанный у Страуструпа. Мне лично нравится. Единственное, что не удалось победить — необходимость явно указывать конструктор для класса С в случае наличия аргументов у T, где
CODE
template<class T> class C: public T
Но это и непобедимо. cool.gif
Как следствие — невозможность создать один шаблон на всех sad.gif

Вернуться в Вопросы программирования в C++Builder