hijo derivadas derivada clases clase delphi class-helpers

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.