Как вызвать метод предка?
01.01.2007
Fantasist
1) Есть Class1, с методом Mtd.
2) Есть Class2 унаследованный от Class1, метод Mtd перезаписан
3) В программе используется переменная типа Class2Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка?
Вариант 1:
Author: Fantasist
Source: Vingrad.ru https://forum.vingrad.ru
Способ 1 (только для не виртуальных методов)
var
a:class2;
begin
a:=class2.Create;
class1(a).mtd;
....
end;
Вариант 2:
Author: Le Taon
Source: 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;

