"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). И недостаток проработанности АРХИТЕКТУРЫ. Я с НАДОБНОСТЬЮ такого- ДАВНО уже не встречался.
Рассказать как это делается? :-)
Читайте Рея Лишнера вообще-то.
А практика "на коленке" такова".
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). И недостаток проработанности АРХИТЕКТУРЫ. Я с НАДОБНОСТЬЮ такого- ДАВНО уже не встречался.
Зря писал видимо...
ОтветитьУдалитьБолее простой способ, правда без контекста для других виртуальных методов, что даже плюс.
ОтветитьУдалитьproc: TProc;
begin
TMethod(m).Data := self;
TMethod(m).Code := @A.X;
proc();
end;
Да. Понятное дело.
Удалить