Как вызвать метод предка?

Previous  Top  Next

    
 

 

1) Есть Class1, с методом Mtd.

2) Есть Class2 унаследованный от Class1, метод Mtd перезаписан

3) В программе используется переменная типа Class2

Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка?

 

Способ 1(только для не виртуальных методов)

Code:

{©Drkb v.3(2007): www.drkb.ru}

var

a:class2;

begin

a:=class2.Create;

class1(a).mtd;

....

end;

 

 

 

 

©Drkb::00102

Автор: Fantasist

Взято с Vingrad.ru http://forum.vingrad.ru

 

 


 

Способ со статическим приведением годится только для

не виртуальных методов, имеющих одно имя.

Вызов же виртуальных методов от статического типа не зависит.

В твоём простейшем случае достаточно написать inherited Mtd;

(ты его можешь вызвать из любого метода TClass2, не только из Mtd).

Трудности возникнут, когда нужно вызвать метод "дедушки" или "прадедушки" и т.д.

Один из способов, описанных в литературе, - временная замена

VMT объекта на "дедушку" и обратно. Но если у дедушки такого метода не было - будет облом.

Я предпочитаю такой способ:

 

Code:

type

{©Drkb v.3(2007): www.drkb.ru}

 

TProc = procedure of object;

procedure TClassN.SomeMethod;

var

Proc: TProc;

begin

TMethod(Proc).Code := @TClass1.Mtd; // Статический адрес

TMethod(Proc).Data := Self;

Proc();

end;

 

 

 

Автор ответа: Le Taon

©Drkb::00103

Взято с Vingrad.ru http://forum.vingrad.ru