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