Главная страница
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.49 MB
Время: 0.05 c
2-1124278816
_ALEX_
2005-08-17 15:40
2005.09.25
Нумерация строк


14-1125419302
Иксик
2005-08-30 20:28
2005.09.25
Золотой фонд советского кино


14-1125597027
Alex_Korn
2005-09-01 21:50
2005.09.25
Изменчивая CRC32.


1-1125402131
Energetik
2005-08-30 15:42
2005.09.25
как сравнить значения ячеек из разных файлов excel


3-1123057899
surkis
2005-08-03 12:31
2005.09.25
Поскажите компоненты и репорты