Ho bisogno di riparare un componente di terze parti. classe di questo componente ha variabile privata che è attivamente utilizzato dai suoi discendenti:Delphi: scrivere nel campo degli antenati privati in classe discendente
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;
Questo funziona perché entrambe le classi sono nella stessa unità, quindi sono Kinda "amici".
Ma se cercherò di creare una nuova classe in una nuova unità
TMyFixedComponent = class (TThirdPartyComponent)
procedure Foo; override;
end;
Non riesco ad accedere più FSomeVar, ma ho bisogno di usarlo per il mio fix. E davvero non voglio riprodurre nel mio codice tutto quell'albero delle classi base.
Potete consigliare qualche trucco rapido per accedere a quel campo privato senza cambiare l'unità del componente originale se è possibile a tutti?
@Andrew: si noti che questa soluzione si interromperà non appena cambia il layout della memoria del componente antenato (di terze parti). Potresti non notare che si rompe, poiché nulla ti avviserà di ciò. Oppure potresti vedere un comportamento errato errato (se sei fortunato: accedere a violazioni) perché inizi a sovrascrivere i dati che non sono tuoi. –
@Jeroen Pluimers Ho notato Andrew su questo fatto. Ma non ci sono altre soluzioni per questo problema. – oodesigner
Gli helper di classe possono eseguire questa operazione senza hacking, vedere la mia risposta :) –