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
|
да нет. я не о том. я знаю как пользоваться с++
вот что нарыл по поводу обхода запрета множ. наследования:
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 И бьём по билдеру его же GetClassName и иже с ним, я уже не помню... Короче, вывернулись. Но конечно читабельность у сырцов уже не та...
Отредактировано Tertium — 01/06/2004, 15:04
|
|
Asher |
Отправлено: 04.06.2004, 13:28 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
Решил внести свои пять копеек
QUOTE | "В данном примере имеем аналог множественного наследования Z от X, Y и TListBox. Изврат конечно, но хоть как-то." |
Зачем сразу изврат...
Стандартный способ, описанный у Страуструпа. Мне лично нравится. Единственное, что не удалось победить — необходимость явно указывать конструктор для класса С в случае наличия аргументов у T, где CODE | template<class T> class C: public T | Но это и непобедимо.
Как следствие — невозможность создать один шаблон на всех
|
|