Servus,
beim Einsatz von Interfaces muss man ja tunlichst darauf achten, Interfaces und Objektzugriff nicht zu mischen, da es sonst zur automatischen Freigabe kommen kann, da die Objektvariable nicht zum RefCount zählt.
Nehmen wir folgendes Beispiel
Delphi-Quellcode:
IFooItem = Interface
['{9995E78E-45DF-4C25-B657-7396738FEA70}']
procedure Bar;
end;
TFooItem = class(TinterfacedObject, IFooItem)
public
procedure Bar;
procedure Foo(const AValue);
end;
Der Konsument meines Interfaces muss lediglich auf die Methode Bar zugreifen. Allerdings benötige ich beim Erzeugen / Initialisieren / Aktualisieren in meinem Owner der Objektinstanz auch die Methode Foo.
Delphi-Quellcode:
TFooOwner = class
private
Fitem: TFooItem
function GetItem: IFooItem
public
property Item: IFooItem getItem;
procedure ChangeItem(const AValue);
end;#
....
procedure TFooOwner.ChangeItem(const AValue)
begin
FItem.Foo(AValue);
end;
Greife ich mit dem Code oben einmal auf Item zu wird aus dem FItem das Interface geholt, übergeben und wenn die aufrufende Methode beendet ist, wird das Interface genilt, der Refcounter kommt bei 0 an und FItem wird frei gegeben.
Die einzige Lösung für das Problem die ich kenne wäre, die Referenzzählung zu "deaktivieren". Die Freigabe der Instanz ist ja kein Problem, da ein Eigentümer da ist, der sich darum kümmert.
Allerdings wird im Netz (und auch hier) davon abgeraten die Referenzzählung zu umgehen - nur warum? Oder Alternativ: Welche andere Möglichkeit gibt es für eine solche Implementierung?