Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как вызвать метод предка

Автор: Fantasist
WEB-сайт: http://forum.vingrad.ru

1) Есть Class1, с методом Mtd.
2) Eсть Class2 наследованный от Class1, метод Mtd перезаписан
3) В программе используется переменная типа Class2

Можно ли из программы вызвать 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;
Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.