Ho bisogno di un modo per scrivere una procedura generica per agire su un tipo di oggetto o uno dei suoi discendenti.come evitare in modo sicuro Delphi Errore: "i tipi di parametri formali ed effettivi devono essere identici"
Il mio primo tentativo è stato quello di dichiarare
procedure TotalDestroy(var obj:TMyObject);
, ma quando lo si utilizza con un oggetto discendente
type TMyNewerObject = class(TMyObject);
var someNewerObject: TMyNewerObject;
TotalDestroy(someNewerObject);
ottengo l'errore famigerate "tipi di parametri formali e attuali devono essere identiche"
Così, mentre stavo cercando una soluzione, ho esaminato il codice sorgente della procedura del sistema Delphi FreeAndNil
. E ho trovato questa dichiarazione impressionante, insieme a questo sorprendente commento
{ FreeAndNil frees the given TObject instance and
sets the variable reference to nil.
Be careful to only pass TObjects to this routine. }
procedure FreeAndNil(var Obj);
Evita il tipo di controllo degli errori, ma utilizza alcuna rete di sicurezza.
La mia domanda è ... esiste un modo sicuro per verificare il tipo di parametro var non tipizzato?
o in altre parole, è possibile migliorare questo codice sorgente Delphi in modo che l'avviso non sia necessario?
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
Non pensi che la procedura sarebbe stata scritta in modo diverso se ci fosse un modo per farlo? –
Non lo so, è per questo che lo sto chiedendo. –
PA, la risposta alla domanda di Lasse è * sì *. Se * ci fosse * un modo migliore, la funzione della libreria l'avrebbe usata. Poiché la funzione di libreria * non * la usa, possiamo tranquillamente concludere che non esiste un modo migliore. –