Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
ВнизВызов метода дальнего предка Найти похожие ветки
← →
Ромик (2002-04-23 15:02) [0]Имеется следующая задача:
есть три класса связанные наследованием
type
C1 = class
procedure Method1;virtual;
end;
type
C2 = class(C1)
procedure Method1;override;
end;
type
C3 = class(C2)
procedure Method1;override;
end;
Известно, что внутри C3.Method1 можно вызвать C2.Method1
как
inherited Method1;
А вот как внутри C3.Method1 явно вызвать C1.Method1?
← →
Игорь Шевченко (2002-04-23 15:12) [1]День добрый,
Обычно, никак :-)
IMHO, можно пытаться через VMT извлекать адрес метода дедушки,
но во всех конференциях по Delphi говорится, что делать этого не стоит.
С уважением,
← →
SVM (2002-04-23 16:03) [2]procedure C3.Method1;
var
ClassOld:TClass;
begin
ClassOld:=PClass(Self)^;
try
PClass(Self)^:=Self.ClassParent.ClassParent;
Method1;
finally
PClass(Self)^:=ClassOld;
end;
end;
← →
MBo (2002-04-23 16:26) [3]procedure C3.Method1;
type tproc=procedure of object;
var m:tmethod;
begin
m.code:=@c1.method1;
m.data:=self;
TProc(m);
end;
← →
Толик (2002-04-23 17:29) [4]to Игорь Шевченко ©:
Ну почему же сразу никак? Очень даже как... Особенно если посмотреть хелпы по VMTOFFSET. Да и в исходниках Делфей подобных вызовов виртуальных ф-й полным полно. Короче, идея состоит в следующем: получить указатель на VMT класса предка через смещение на vmtParent (ну или использовать ф-ю ClassParent), а затем вызывать то, что лежит по адресу VMT предка + VMTOFFSET необходимой ф-и.
← →
MBo (2002-04-23 17:32) [5]IMHO, подобные извраты проистекают из неверного построения классовой иерархии и т.п.
← →
Игорь Шевченко (2002-04-23 17:34) [6]День добрый, Толик ©,
> Да и в исходниках Делфей подобных вызовов виртуальных ф-й
> полным полно
Примеры готовы привести? :-)
С уважением,
← →
Игорь Шевченко (2002-04-23 17:36) [7]День добрый, MBo ©,
> подобные извраты проистекают из неверного построения классовой
> иерархии
Что интересно, в borland.public.delphi.objectpascal тоже так считают :-))
С уважением,
← →
Ромик (2002-04-23 17:47) [8]Спасибо всем откликнувшимся.
Очень не хотелось лазить по VMT, но видно придется.
Значит простых методов нет. А ведь в добром старом BP7
все делалось просто.
← →
Бурундук (2002-04-23 18:10) [9]>Очень не хотелось лазить по VMT, но видно придется.
А чем тебе, собственно, не нравится метод, предложенный MBo?
Он безо всяких копаний в VMT и наиболее безопасен из
всех возможных вариантов.
← →
vuk (2002-04-23 19:08) [10]>А ведь в добром старом BP7 все делалось просто.
В старом добром BP не было методов класса. Именно тот же сакмый синтаксис используется в BP для вызовов методов предка.
А вообще поддерживаю MBo, само возникновение такой необходимости говорит о не совсем верном проектировании классов.
← →
Adder (2002-04-23 21:52) [11]>А ведь в добром старом BP7 все делалось просто.
Если не надо обращаться к данным, то можно и почти как "в добром старом BP7 " сделать:
type
C1 = class
class procedure Method1; virtual;
end;
type
C2 = class(C1)
class procedure Method1; override;
end;
type
C3 = class(C2)
class procedure Method1;override;
end;
class procedure C1.Method1;
begin
writeln("Grand");
end;
class procedure C2.Method1;
begin
writeln("Dad");
end;
class procedure C3.Method1;
begin
writeln("Son");
c1.Method1;
end;
← →
vuk (2002-04-23 22:43) [12]Самый правильный метод (ИМХО) - перестроить того самого предка таким образом, чтобы тот код, к которому будут обращаться потомки был вынесен в отдельный метод, а из виртуального метода было к этому отдельному методу обращение.
← →
Толик (2002-04-24 12:19) [13]to MBo ©:
>>IMHO, подобные извраты проистекают из неверного построения классовой иерархии и т.п.
- Подобные извраты проистекают из-за кривой реализации виртуальных ф-й в Делфях. Ну криво они реализованы (по сравнению с С++) и всё тут!!! Не забыли мои вопросы по поводу вызова виртуальных ф-й через указаль??? Да и вообще, на Делфях надо делать то, что они умеют лучше всего: быстро делать пользовательский интерфейс, рисовать бантики и рюшечки. А всю серьёзную логику писать на том, что к этому наиболее приспособлено (напр. тот же Borland C++ Builder или Visual C++)
to Игорь Шевченко ©:
>>Примеры готовы привести? :-)
-Сделать поиск по System.pas Именно оттуда я об этот и узнал :)
← →
Игорь Шевченко (2002-04-24 12:33) [14]День добрый, Толик ©,
>Да и в исходниках Делфей подобных вызовов виртуальных ф-й >полным полно
> -Сделать поиск по System.pas Именно оттуда я об этот и узнал
И что же там искать ?
Я, сколько не искал, вызовов виртуальных функций таким методом не нашел :-)
И механизм виртуальных функций в Delphi реализован вполне нормально...
А писать серьезные вещи можно одинаково и на Delphi и на C++, между прочим :-))
С уважением,
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c