|
||||||||||
|
||||||||||
|
||||||||||
|
Как вызвать метод предка
Автор: Fantasist
1) Есть Class1, с методом Mtd. Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка? Способ 1(только для не виртуальных методов) var a: class2; begin a := class2.Create; class1(a).mtd; .... end; Дополнение: Le Taon Способ со статическим приведением годится только для невиртуальных методов, имеющих одно имя. Вызов же виртуальных методов от статического типа не зависит. В твоём простейшем случае достаточно написать 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; |
  |
![]() |
![]() |