Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
1-26148
SerKom
2002-04-24 23:41
2002.05.09
сервис NT


14-26258
PVOzerski
2002-04-02 11:38
2002.05.09
Чем занят комп в


6-26220
ATLANTIDO
2002-02-23 20:47
2002.05.09
РАСШАРИТЬ ДИСК


1-26182
NDVBrest
2002-04-24 18:39
2002.05.09
Работа с TThread


14-26227
McSimm
2002-04-01 11:30
2002.05.09
Встреча в чате. Сайт приобретает широкую известность





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский