delphi - derivadas - ¿Cómo uso los ayudantes de clase para acceder a miembros privados estrictos de una clase?
clase padre e hijo en java (2)
El acceso a miembros private
y strict private
de una clase con class helpers
fue eliminado en Delphi 10.1 Berlín. Consulte Cómo cerrar el Loophole de acceso privado de Class Helpers .
Pero todavía hay una laguna abierta:
unit Shy;
interface
type
TShy = class(TObject)
strict private
procedure TopSecret;
private
procedure DirtyLaundry;
protected
procedure ResistantToChange;
end;
implementation
procedure TShy.DirtyLaundry;
begin
WriteLn(''DirtyLaundry'');
end;
procedure TShy.ResistantToChange;
begin
WriteLn(''ResistantToChange'');
end;
procedure TShy.TopSecret;
begin
WriteLn(''TopSecret'');
end;
end.
Program TestClassHelpers;
{$APPTYPE CONSOLE}
Uses
Shy;
type
TNotShy = class helper for TShy
public
procedure LetMeIn;
end;
procedure TNotShy.LetMeIn;
var
P : procedure of object;
begin
TMethod(P).Code := @TShy.TopSecret;
TMethod(P).Data := Self;
P; // Call TopSecret
TMethod(P).Code := @TShy.DirtyLaundry;
TMethod(P).Data := Self;
P; // Call DirtyLaundry;
Self.ResistantToChange; // Protected access works without problems
end;
var
myObj: TShy;
begin
myObj := TShy.Create;
try
myObj.LetMeIn;
ReadLn;
finally
myObj.Free;
end;
end.
Esta es una pregunta de seguimiento a: ¿Cómo ocultar un procedimiento protegido de un objeto?
(Estoy un poco confuso en el concepto de ayudante de clase)
Supongamos que tengo una clase como:
type
TShy = class(TObject)
strict private
procedure TopSecret;
private
procedure DirtyLaundry;
protected
procedure ResistantToChange;
end;
Sé que puedo acceder al método privado si tengo el código fuente al agregar una clase descendiente en la misma unidad.
Tengo 2 preguntas:
- ¿Cómo empleo un ayudante de clase para acceder al miembro strict private
?
- ¿Puedo usar un ayudante de clase en una unidad separada para acceder a miembros privados (estrictos)?
Hasta, e incluyendo Delphi 10.0 Seattle, puedes usar un ayudante de clase para acceder a miembros strict private
y strict protected
, como este:
unit Shy;
interface
type
TShy = class(TObject)
strict private
procedure TopSecret;
private
procedure DirtyLaundry;
protected
procedure ResistantToChange;
end;
unit NotShy;
interface
uses
Shy;
type
TNotShy = class helper for TShy
public
procedure LetMeIn;
end;
implementation
procedure TNotShy.LetMeIn;
begin
Self.TopSecret;
Self.DirtyLaundry;
Self.ResistantToChange;
end;
end.
uses
..., Shy, NotShy;
procedure TestShy;
var
Shy: TShy;
begin
Shy := TShy.Create;
Shy.LetMeIn;
Shy.Free;
end;
Sin embargo, comenzando con Delphi 10.1 Berlin, ¡ esto ya no funciona ! Los ayudantes de clase ya no pueden acceder a miembros strict protected
, strict private
, strict private
o private
. Esta "característica" fue en realidad un error de compilación que Embarcadero ya ha corregido en Berlín. Estás fuera de suerte.