![]() |
AW: gemischter Interface-/Objektzugriff
Zitat:
|
AW: gemischter Interface-/Objektzugriff
Zitat:
Und die DLL (als Konsument) soll dabei nur die notwendigsten Informationen/Möglichkeiten bekommen, in meiner Anwendung aber brauch ich gerade zum Zeitpunkt der Initialisierung die eine oder andere Funktion mehr. Beispiel: Eine Liste von Objekten (bzw. Interfaces) die in der DLL abgearbeitet werden müssen. Die DLL braucht weder neue Elemente der Liste hinzufügen noch löschen, daher definiert das dafür zuständige Listen-Interface auch nur eine get und eine count Methode. |
AW: gemischter Interface-/Objektzugriff
Spannende Frage. Ich würde es intuitiv so machen:
Delphi-Quellcode:
und dann im Kontruktor:
private
FItem: IFooItem; FFooItem: IFooFooItem;
Delphi-Quellcode:
Das mit der Referenzzählung ist immer spaßig, man kann dann aber auch über Logging der aktuellen Referenzanzahl einiges schneller aufdecken als im Debugger.
constructor TFooOwner.Create(const AItem: TFooItem);
begin inherited Create; FItem := AItem; FFooItem := AItem; end; |
AW: gemischter Interface-/Objektzugriff
Bischen viel Quote, Sorry
Zitat:
Delphi-Quellcode:
und jetzt der Owner:
IFooItem = Interface
['{9995E78E-45DF-4C25-B657-7396738FEA70}'] procedure Bar; end; IFooFooItem =Interface ['{9995E78E-45DF-4C25-B657-7396738FEA70}'] procedure Foo(const AValue); end; TFooItem = class(TinterfacedObject, IFooItem, IFooFooItem) public procedure Bar; procedure Foo(const AValue); end; function CreateItem():IFooItem; ... function CreateItem():IFooItem; begin Item := TFooItem.Create() as IFooItem; end;
Delphi-Quellcode:
TFooOwner = class
private Fitem: IFooItem function GetItem: IFooItem public property Item: IFooItem getItem; property FooItem: IFooFooItem GetFooItem; end; ... procedure TFooOwner.DoAbc(); var FooFooItem: IFooFooItem; begin if not Supports(Item, IFooFooItem) then raise EPanic...; FooFooItem := Item as IFooFooItem; FooFooItem.Foo(abc) end; Zitat:
Die beiden interfaces würde ich dann auch nicht in eine unit packen. |
AW: gemischter Interface-/Objektzugriff
Ich sehe da einen gewissen "friend" Status bei deinen beiden Klassen. In solchen Fällen lasse ich da auch schonmal fünfe gerade sein und nutze intern die Klasse, auf welche extern nur über das Interface zugegriffen wird als Objekt.
Handelt es sich dabei um TInterfacedObject Nachfahren, nutz ich _AddRef und _Release an den Stellen wo ich mein internes Objekt feld setze bzw wenn der Owner freigegeben wird. Das hat denselben Effekt wie als Interface zu speichern aber ich kann noch auf die Methoden, die nicht im Interface vorhanden sind zugreifen (plus wenn relevant bessere Performance und sogar inlining möglich, aber das sei nur am Rande erwähnt) Ob du das machst oder von einer Klasse erbst, die keine Referenzzählung und entsprechende Speicherverwaltung implementiert, hängt letztlich davon ab, was per Design länger lebt, wenn das irgendwelche Referenzen auf das Interface sein können, dann nutz ich die erste Möglichkeit um keine Interface referenzen auf schon freigegebene Instanzen zu befürchten, ist es anders herum, kann man die zweite Möglichkeit erwägen. |
AW: gemischter Interface-/Objektzugriff
Wenn beim Erzeugen des Objektes zusätzliche Methoden oder Properties angesprochen werden, braucht man dafür eigentlich kein zweites Interface.
Man muss nur klar abgrenzen, bis wo ohne Referenzzählung mit dem Objekt gearbeitet wird. Danach sollte das Objekt nicht mehr direkt referenziert werden.
Delphi-Quellcode:
type
IFooItem = Interface ['{9995E78E-45DF-4C25-B657-7396738FEA70}'] procedure Foo(const AValue); end; TFooItem = class(TinterfacedObject, IFooItem) public procedure Bar; procedure Foo(const AValue); end; TFooOwner = class private FItem: IFooItem function CreateItem: TFooItem; function GetItem: IFooItem; public property Item: IFooItem GetItem; end; implementation function TFooOwner.CreateItem: TFooItem; begin Result := TFooItem.Create; Result.Bar; end; function TFooOwner.GetItem: IFooItem; begin if not Assigned(FItem) then FItem := CreateItem; // Referenzzählung beginnt Result := FItem; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz