четверг, 17 октября 2013 г.

Коротко. Из поисковых запросов к блогу. "delphi inherited вызов прапредка".

"delphi inherited вызов прапредка"

Рассказать как это делается? :-)


Читайте Рея Лишнера вообще-то.


А практика "на коленке" такова".


type

 A = class
  procedure X; virtual;
 end;

B = class(A)

 procedure X; override;
end;

C = class(B)

 procedure X: override;
end;

procedure C.X;

var
 l_Save : Pointer;
begin
 inherited X;
 // зовётся B.X
 l_Save := PPointer(Self)^;
 try
  PPointer(Self)^ := A;
  inherited X;
  // или Self.X; не помню уже.. пишу "с листа"...
  // зовётся A.X
  // Но! НАДО понимать, что и ДРУГИЕ ВИРТУАЛЬНЫЕ методы в КОНТЕКСТЕ А.X будут зваться от "имени A"
 finally
  PPointer(Self)^ := l_Save;
 end;
end;

А вообще это конечно - "хоккей" (http://18delphi.blogspot.ru/2013/04/blog-post_8.html). И недостаток проработанности АРХИТЕКТУРЫ. Я с НАДОБНОСТЬЮ такого- ДАВНО уже не встречался.

3 комментария:

  1. Более простой способ, правда без контекста для других виртуальных методов, что даже плюс.

    proc: TProc;
    begin
    TMethod(m).Data := self;
    TMethod(m).Code := @A.X;
    proc();
    end;

    ОтветитьУдалить