Salve a tutti,
vorrei porre una domanda che sinceramente non mi sono mai posto, ma la cui risposta ora mi sarebbe utile.
Come porre a nil la risultante della creazione di un oggetto, però durante la creazione dello stesso oggetto (o meglio della sua istanza)?
Faccio un esempio concreto:
type TMiaClasse = Class
.....
.....
public
constructor Create(....): override;
end;
constructor TMiaClasse.Create(....);
begin
inherited Create;
....
....
if qualcosa_è_andato_male then
begin
!!! Qui vorrei fare qualcosa per ritornare NIL invece del solito handle alla classe .....
!!! Ovviamente dovrò anche andare ad effettuare il "destroy" in qualche modo, avendo effettuato il CREATE .....
end;
end;
//Uso
var MiaClasse = TMiaClasse;
begin
MiaClasse := TMiaClasse.Create(....); //QUI MIACLASSE DOVREBBE ESSERE A NIL SE QUALCOSA VA' STORTO.
end;
Attualmente, come penso facciano tutti, setto un flag interno se qualcosa non và e tramite un proprietà pubblica in sola lettura vado a vedere se il flag è settato e pongo a nil la variabile (eventualmente effettuando il free se non è già a nil).
L'alternativa è generare una eccezione e tracciare con il try / except e gestire come per il flag sopra descritto l'eccezione.
Diciamo che il modo naturale è l'eccezione, ma a me non piace molto perchè in passato qualche problema l'ho avuto e preferirei che le eccezioni rimangano relegate a livello di metodo senza uscire dal begin / end
Attendo vs. proposte
Grazie e ciao ciao
ciao
ora non riesco a provare con lazarus
mi verrebbe da dire se si riesce ad impostare self a nil da dentro il costruttore
forse l'ho sparata grossa ;D
PS:
creare una factory in cui incapsulare il tutto?
var MiaClasse = TMiaClasse;
begin
MiaClasse := MyClassFactory(TMiaClasse); // al rientro dalla funzione/factory basta impostare a nil
end;