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

1) Есть Class1, с методом Mtd.
2) Есть Class2 унаследованный от Class1, метод Mtd перезаписан
3) В программе используется переменная типа Class2
Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка?
Способ 1(только для не виртуальных методов)

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

var

 a:class2;

begin

a:=class2.Create;

class1(a).mtd;

....

end;

Автор: Fantasist
Взято с Vingrad.ru http://forum.vingrad.ru

Способ со статическим приведением годится только для
не виртуальных методов, имеющих одно имя.
Вызов же виртуальных методов от статического типа не зависит.
В твоём простейшем случае достаточно написать inherited Mtd;
(ты его можешь вызвать из любого метода TClass2, не только из Mtd).
Трудности возникнут, когда нужно вызвать метод "дедушки" или "прадедушки" и т.д.
Один из способов, описанных в литературе, - временная замена
VMT объекта на "дедушку" и обратно. Но если у дедушки такого метода не было - будет облом.
Я предпочитаю такой способ:

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
Взято с Vingrad.ru http://forum.vingrad.ru

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...