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

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

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

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

 

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

Code:

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

var

a:class2;

begin

a:=class2.Create;

class1(a).mtd;

....

end;

 

 

 

 

 

Автор:Fantasist

Взято с Vingrad.ruhttps://forum.vingrad

 

 


 

Способ со статическим приведением годится только для

не виртуальных методов, имеющих одно имя.

Вызов же виртуальных методов от статического типа не зависит.

В твоём простейшем случае достаточно написать inherited Mtd;

(ты его можешь вызвать из любого метода TClass2, не только из Mtd).

Трудности возникнут, когда нужно вызвать метод "дедушки" или "прадедушки" и т.д.

Один из способов, описанных в литературе, - временная замена

VMT объекта на "дедушку" и обратно. Но если у дедушки такого метода не было - будет облом.

Я предпочитаю такой способ:

 

Code:

type

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

 

TProc = procedureofobject;

procedure TClassN.SomeMethod;

var

Proc: TProc;

begin

TMethod(Proc).Code := @TClass1.Mtd; // Статический адрес

TMethod(Proc).Data := Self;

Proc();

end;

 

 

 

Автор ответа:Le Taon

 

Взято с Vingrad.ruhttps://forum.vingrad

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить