Necesito reparar un componente de un tercero. La clase de este componente tiene variable privada que se utiliza activamente por sus descendientes:Delphi: escribir en el campo del antecesor privado en la clase descendiente
TThirdPartyComponentBase = class
private
FSomeVar: Integer;
public
...
end;
TThirdPartyComponent = class (TThirdPartyComponentBase)
protected
procedure Foo; virtual;
end;
procedure TThirdPartyComponent.Foo;
begin
FSomeVar := 1; // ACCESSING PRIVATE FIELD!
end;
Esto funciona porque ambas clases están en la misma unidad, por lo que Usted es un poco "amigos".
Pero si voy a tratar de crear una nueva clase en una nueva unidad
TMyFixedComponent = class (TThirdPartyComponent)
procedure Foo; override;
end;
No puedo acceder a FSomeVar más, pero necesito usarlo para mi dosis. Y realmente no quiero reproducir en mi código todo ese árbol de clases base.
¿Puede aconsejar algún truco rápido para acceder a ese campo privado sin cambiar la unidad del componente original si es posible?
@Andrew: tenga en cuenta que esta solución se interrumpirá tan pronto como el diseño de la memoria del componente ancestro (de terceros) cambie. Es posible que no notes que se rompe, ya que nada te lo advertirá. O es posible que vea un comportamiento espurio incorrecto (si tiene suerte: violaciones de acceso) porque comienza a sobrescribir datos que no son suyos. –
@Jeroen Pluimers He notado a Andrew sobre ese hecho. Pero no hay otras soluciones para este problema. – oodesigner
Los ayudantes de clase pueden hacer esto sin piratear, ver mi respuesta :) –