Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007

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

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

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

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

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

var
  a
:class2;
begin
a
:=class2.Create;
class1
(a).mtd;
....
end;

Автор: Fantasist

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


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

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

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

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

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

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

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

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

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

type

 
 
TProc = procedure of object;
procedure
TClassN.SomeMethod;
var
 
Proc: TProc;
begin
 
TMethod(Proc).Code := @TClass1.Mtd; // Статический адрес
 
TMethod(Proc).Data := Self;
 
Proc();
end;

Автор: Le Taon

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