Nur z.B. bei TComponent-Nachfahren kann man Beides benutzen, da dort die Referenzzählung deaktiviert wurde.
Benutzen schon, aber eine Komponente einfach wie im folgenden Beispiel um ein Interface zu erweitern geht nur um den Preis von Memory Leaks. Der folgende Code erzeugt ein Leak einer Instanz von TMyImplementation:
Delphi-Quellcode:
program LeakTest;
uses
Classes;
type
MyInterface = interface
end;
TMyImplementation = class(TComponent, MyInterface)
end;
TMyContainer = class(TObject)
private
FInt: MyInterface;
public
property Impl: MyInterface read FInt write FInt;
end;
var
C: TMyContainer;
begin
ReportMemoryLeaksOnShutdown := True;
C := TMyContainer.Create;
C.Impl := TMyImplementation.Create(nil);
C.Free;
end.
Das Memory Leak ergibt sich nur bei
TComponent als Basisklasse. Mit
TInterfacedObject als Basisklasse wird das über Interface verwaltete Feld
FInt beim Destroy mit freigegeben, und kein Leak bleibt zurück.
Unter Stackoverflow kann man den Hintergrund dieses Verhaltens detailliert nachlesen.
Why do interface implementations based on TComponent leak memory?