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

Материал из DRKB

Как вызвать метод предка?[править | править код]

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

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

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

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


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

var
  a: Class2;
begin
  a := Class2.Create;
  Class1(a).mtd;
  //....
end;


Author: Fantasist
Source: http://forum.vingrad.ru
ID: 00102


Способ со статическим приведением годится только для не виртуальных методов, имеющих одно имя. Вызов же виртуальных методов от статического типа не зависит. В твоём простейшем случае достаточно написать 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;


Author: Le Taon
Source: http://forum.vingrad.ru
ID: 00103