Einzelnen Beitrag anzeigen

Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#1

gemischter Interface-/Objektzugriff

  Alt 18. Mai 2017, 09:38
Delphi-Version: 7
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?
  Mit Zitat antworten Zitat