Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.09;
Скачать: CL | DM;

Вниз

Вызов метода дальнего предка   Найти похожие ветки 

 
Ромик   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
14-26272
Keymaster
2002-03-31 16:15
2002.05.09
Утановка Win2K


1-26136
Samvel
2002-04-24 10:55
2002.05.09
Компиляция


1-26188
PaRL
2002-04-25 16:04
2002.05.09
*INI


3-25998
Dimedrol
2002-04-09 15:56
2002.05.09
Все время этот LoginPrompt !


1-26129
Basilio
2002-04-23 16:59
2002.05.09
try..except не работает