Also ganz in Ordnung finde ich den Code auch nicht allerdings wegen etwas anderem.
Delphi-Quellcode:
constructor TAbgeleiteteKlasse.Create;
begin
FStream := TMemoryStream.Create;
inherited Create(FStream);
end;
destructor TAbgeleiteteKlasse.Destroy;
begin
[...]
FStream.Free;
end;
Und zwar ist hier ersichtlich das der Constructor der Vorfahrenklasse einen Constructor hat dem ein Stream übergeben wird.
Auch wenn der Constructor der neuen Klasse diesen Parameter nicht mehr hat ist es trotzdem noch möglich den Constructor der Vorfahrenklasse aufzurufen und den Stream zu übergeben. In dem Fall ist es Fatal das im neuen Destructor einfach mein übergebener Stream frei gegeben wird.
Bsp.:
Delphi-Quellcode:
var
mystream: TStream;
tmp: TAbgeleiteteKlasse;
begin
MyStream := TMemoryStream.Create();
tmp := TAbgeleiteteKlasse.Create(myStream);
[...]
tmp.Free;
//jetzt ist plötlizlich mystream freigegeben obwohl das bei der Vorfahrenklasse noch nicht der Fall war
[...]
Also ein eindeutiger Designfehler. Das worüber hier die ganze Zeit diskutiert wird kann ich nicht nachvollziehen denn es ist tatsächlich ab und zu der Fall das man erst nach dem inherited im Destructor etwas freigeben kann. Das ist zum Beispiel der Fall wenn im Destructor der Klasse von der man ableitet noch OnChange-Ereignisse/Speichern-Methoden etc. aufgerufen werden die durch Vererbung Dinge aus dem Nachfahren verwenden.