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

Вниз

Вызов метода минуя непосредственного предка?   Найти похожие ветки 

 
CrowD   (2005-08-30 18:05) [0]

Привет, All!

можно ли в Delphi имея иерархию из 3 классов в первом из которых опрделем метод, а в 2 последних он переопределен, из последнего 3 класса вызвать метод 1 минуя промежуточный 2, если да то как?

Спасибо.


 
begin...end ©   (2005-08-30 18:07) [1]

Имеется в виду виртуальный метод?


 
CrowD   (2005-08-30 18:11) [2]

да


 
Юрий Зотов ©   (2005-08-30 18:12) [3]

Уточните - методы статические, динамические или виртуальные. Это важно.


 
CrowD   (2005-08-30 18:16) [4]

Class1
function myFunc: integer; virtual;

Class2
function myFunc: integer; override;

Class3
function myFunc: integer; override;


 
begin...end ©   (2005-08-30 18:19) [5]

> CrowD   (30.08.05 18:11) [2]

type
 TFirst = class
   procedure Method; virtual;
 end;

 TSecond = class(TFirst)
   procedure Method; override;
 end;

 TThird = class(TSecond)
   procedure Method; override;
 end;

var
 Third: TThird;
 ThirdClass: TClass;
begin
 Third := TThird.Create;
 try
   // ...
   ThirdClass := Third.ClassType;
   try
     PPointer(Third)^ := Third.ClassParent.ClassParent;
     Third.Method
   finally
     PPointer(Third)^ := ThirdClass
   end;

   // ...
 finally
   Third.Free
 end
end.


 
CrowD   (2005-08-30 18:27) [6]

а чтонибудь попроще, по примеру inherited ?


 
Турист   (2005-08-30 21:42) [7]

>CrowD   (30.08.05 18:05)  

type
  TMyMethod = procedure (aSelf: Pointer);

procedure TThird.Method;
begin
  ShowMessage("3");
  TMyMethod(@TFirst.Method)(Self)
end;


 
TUser ©   (2005-08-30 21:50) [8]

Конопка даже объясняет, почему нельзя, только я точно не воспроизведу.


 
tesseract ©   (2005-08-30 22:12) [9]

Вообще согласно теории RTTI ты можешь вызвать метод родителя из любого потомка, так что попробуй.


 
Игорь Шевченко ©   (2005-08-31 10:40) [10]


> можно ли в Delphi имея иерархию из 3 классов в первом из
> которых опрделем метод, а в 2 последних он переопределен,
> из последнего 3 класса вызвать метод 1 минуя промежуточный
> 2, если да то как?


Изменить иерархию классов и перестать желать странного.


 
PVOzerski ©   (2005-08-31 11:13) [11]

Ну, если нужно обойтись без трюков вроде лазания по VMT, почему бы не вот так:

type
 t1 = class
   function VeryImportant: integer; virtual;
 end;

 t2 = class(t1)
   function VeryImportant: integer; override;
   function OldMethod: integer;
 end;

 t3 = class(t2)
   function VeryImportant: integer; override;
 end;

function t1.VeryImportant: integer;
begin
 Result := 1;
end;

function t2.VeryImportant: integer;
begin
 Result := 2;
end;

function t3.VeryImportant: integer;
begin
 Result := 3;
end;

function t2.OldMethod: integer;
begin
 Result := inherited VeryImportant;
end;



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.055 c
3-1124180709
Андрей Жук
2005-08-16 12:25
2005.09.25
Или я чего-то не понимаю, или Firebird глючит


9-1117104669
Buffer
2005-05-26 14:51
2005.09.25
DX VertexBuffer


2-1123952654
Андрей Молчанов
2005-08-13 21:04
2005.09.25
Диалоги


1-1125317950
Cherrex
2005-08-29 16:19
2005.09.25
Как динамически добавить компонент на форму


1-1125486062
Piero
2005-08-31 15:01
2005.09.25
Как сделать диалог для выбора компьютера в сети





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский