J'ai besoin de réparer un composant tiers. La classe de cette composante a variable privée qui est activement utilisé par ses descendants:Delphi: écrire dans le champ de l'ancêtre privé dans la classe descendante
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;
Cela fonctionne parce que les deux classes sont dans la même unité, ils sont donc Kinda « amis ».
Mais si je vais essayer de créer une nouvelle classe dans une nouvelle unité
TMyFixedComponent = class (TThirdPartyComponent)
procedure Foo; override;
end;
Je ne peux pas accéder à FSomeVar plus, mais je dois l'utiliser pour mon correctif. Et je ne veux vraiment pas reproduire dans mon code tout cet arbre des classes de base.
Pouvez-vous conseiller un piratage rapide pour accéder à ce champ privé sans changer l'unité du composant d'origine si c'est possible du tout?
@Andrew: notez que cette solution se casse dès que la disposition de la mémoire du composant ancêtre (tiers) change. Vous pourriez ne pas remarquer que ça casse, car rien ne vous en avertira. Ou vous pourriez voir de faux comportements erronés (si vous êtes chanceux: violations d'accès) parce que vous commencez à écraser des données qui ne vous appartiennent pas. –
@Jeroen Pluimers J'ai remarqué Andrew à ce sujet. Mais il n'y a pas d'autres solutions pour ce problème. – oodesigner
Les assistants de classe peuvent le faire sans piratage, voir ma réponse :) –