![]() |
Problem mit automatischem freigeben von Interfaces
Moin,
Habe nen problem: Wenn ich eine Klasse TFoo haben, die IFoo implementiert und jetzt folgendes mache:
Delphi-Quellcode:
Knallst wegen dem reference counting. Wie mach ich es jetzt am besten, das ich ein Object and eine methode übergebe, die ein Interface erwartet?procedure TOtherClass.Test(AFoo: IFoo); begin AFoo.DoSomething(); end; procedure TTestClass.Action(); var LFoo: TFoo; LOtherClass: TOtherClass; begin LFoo := TFoo.Create(); LOtherClass := TOtherClass.Create(); LOtherClass.Test(LFoo); LFoo.dosomethingmore();<-- hier ists bereits freigegeben end; Ich brauche das object danach noch :| Muss ich mir das Interface seperat rausholen und das übergeben?(womit ich die interface variable bis zum ende behalten kann) MFG Memnarch |
AW: Problem mit automatischem freigeben von Interfaces
Kurz und knapp: ja, aber du musst, kein kann
EDIT: Allerdings hängt es auch davon ab, wovon deine Klasse abgeleitet wurde. Von TComponent, dann passiert das nicht ;) |
AW: Problem mit automatischem freigeben von Interfaces
Zitat:
Und wieso passiert das da nicht?! edit: ah ok, sehe TComponent implementiert interfaces, meine letzte Frage bleibt aber bestehen, und für nicht visuelle objecte die nur etwas bearbeiten scheints mir fehl am platz von TComponent abzuleiten. Momentan wird von TInterfacedObject abgeleitet. |
AW: Problem mit automatischem freigeben von Interfaces
Weil TComponent die Referenzzählung deaktiviert, aber das möchtest du ja gar nicht.
An der Stelle ist es ganz einfach: Mit dem Objekt darf man nur arbeiten bis es das erste Mal als Interface benutzt wird. (Oder lokal eine Interfacevariable halten.) |
AW: Problem mit automatischem freigeben von Interfaces
@Jaenick: oh das abschalten der Zählung macht nichts. Den automatismuss brauch ich gar nicht, da die objekte bisher eh normal verwaltet wurden, und es auch weiterhin werden sollen(heute erst den Interface kram implementiert weil ich ne klassenübergreifende schnittstelle brauchte)
EDIT: so jetzt gibts TUncountedInterfacedObject, und die Welt ist wieder heile :P |
AW: Problem mit automatischem freigeben von Interfaces
Es gibt 2 sinnvolle Praktiken.
In die Referenzzählung würde ich nicht eingreifen, denn für denjenigen, der den Code liest, wäre das überraschend. a) nur mit dem Interface arbeiten
Delphi-Quellcode:
b.) wie a.) nur darf zusätzlich noch auf das Objekt zugegriffen werden
procedure TOtherClass.Test(AFoo: IFoo);
begin AFoo.DoSomething(); end; procedure TTestClass.Action(); var Foo: IFoo; // nicht das Objekt, sondern den Interfacezeiger speichern LOtherClass: TOtherClass; begin Foo := TFoo.Create(); LOtherClass := TOtherClass.Create(); LOtherClass.Test(Foo); Foo.dosomethingmore(); // dosomethingmore() muss natürlich im Interface deklariert sein end;
Delphi-Quellcode:
procedure TOtherClass.Test(AFoo: IFoo);
begin AFoo.DoSomething(); end; procedure TTestClass.Action(); var Foo: IFoo; // FooObj : TFoo; // LOtherClass: TOtherClass; begin FooObj := TFoo.Create(); Foo := FooObj; // Achtung: FooObj darf nicht mit Free freigegeben werden LOtherClass := TOtherClass.Create(); LOtherClass.Test(Foo); FooObj.dosomethingmore(); ... FooObj := nil; // Zeile dient nur dazu uns daran zu erinnern, dass FooObj nicht mit Free freigegeben werden darf end; |
AW: Problem mit automatischem freigeben von Interfaces
TInterfacePersistant ?
|
AW: Problem mit automatischem freigeben von Interfaces
@Bummi: Oh, hatte gar nicht gesehen das TInterfacedPersistent den Refcounter u.U. auch abschaltet o.O
|
AW: Problem mit automatischem freigeben von Interfaces
Wenn eine Interface-Referenz per const übergeben wird, wird keine autom. Referenzzählung gemacht.
Delphi-Quellcode:
Natürlich kann die Implementierung von DoSomething wiederum zu Referenzzählungsproblemen führen.
procedure TOtherClass.Test(const AFoo: IFoo);
begin AFoo.DoSomething(); end; Aber nicht weil es auf eien Interface-Referenz ausgeführt wird, sondern weil dort vllt AFoo als Interface irgendwo reingestopft wird... |
AW: Problem mit automatischem freigeben von Interfaces
Zitat:
Übergibt man eine objektinstans ala TFoo, dann wird diese schon vor dem Methodenaufruf in ein Interface "konvertiert" und dabei wird natürlich kurzzeitig die Referenzzählung beeinflußt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 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 by Thomas Breitkreuz