![]() |
Interfaces ohne Referenzzählung?
So wie ich es verstanden habe, erfolgt bei allen Klassen, die ein Interface implementieren, eine automatische Referenzzählung, und jede Instanz wird freigegeben, wenn der Referenzzähleer auf null ist. Irgendwie ist mir das nicht ganz geheuer, ivh möchte mich lieber selbst um die Freigabe meiner Objekte kümmern. Gibt es eine Möglichkeit, Interfaces zu verwenden, ohne dass eine automatische Freigabe der Objekte erfolgt.
|
AW: Interfaces ohne Referenzzählung?
Benutze nicht TInterfacedObject und implementiere die entsprechenden Methoden selbst.
|
AW: Interfaces ohne Referenzzählung?
Hmmm, also mal sehen was da mit einem normalen TObject passiert:
Delphi-Quellcode:
Die Instanz von TMyObject ist jetzt unwiederbringlich verloren ... weil wir haben den Kontakt verloren.
foo := TMyObject.Create;
foo := nil; Folge: Speicherleck! Bei einem Interface kann das nicht passieren, das würde in so einem Fall auch aus dem Speicher entfernt. Ich verstehe somit nicht, warum du die Referenzzählung ausschalten möchtest. Es gibt aber die Möglichkeit die Referenzzählung zu beeinflussen, indem du die Klasse einfach von TObject und nicht von TInterfaecObject ableitest. Die Referenzzählung musst du dann selber implementieren. |
AW: Interfaces ohne Referenzzählung?
Bei Komponenten (TComponent-Ableitungen) wird die Freigabe der übergeordneten Komponente überlassen. Die Implementierung dort zeigt wie es gehen kann, ohne dass das Objekt freigegeben wird, auch wenn die letzte Schnittstellenreferenz verschwindet.
|
AW: Interfaces ohne Referenzzählung?
Zitat:
|
AW: Interfaces ohne Referenzzählung?
wenn Du eine weniger fette Basisklasse suchst:
TInterfacedPersistent |
AW: Interfaces ohne Referenzzählung?
Die Objekte, um die es geht, sind Ableitungen verschiedenster Komponenten, die also normalerweise automatisch gelöscht werden, wenn ihr Owner - das Formular - gelöscht wird.
Das Interface, das ihnen allen gemeinsam ist, enthält z.B. eine function IsValid: boolean Dazu wird ein Nachkomme von TForm implementiert, der zum passenden Zeitpunkt alle Komponenten des Formulars durchgeht, und bei den Komponenten, die dieses Interface implementieren, die Gültigkeit der Eingabe mittels IsValid prüft. Nachdem Formularkomponenten ohnehin automatisch richtig freigegeben werden, möchte ich nicht durch die Einführung eines Interface eine völlig überflüssige und u.U. schädliche Referenzzählung zusätzlich haben. Mir ist aber eben nicht klar, für welche Objekte Delphi die automatische Referenzzählung aktiviert. Genügt es, dass irgend ein beliebiges Interface angegeben wird, um die Referenzzählung auszulösen, oder kann ich Interfaces definieren, die das nicht machen? Klarerweise kann ich nicht von TInterfacedPersistent ableiten, weil es sich eben um Nachkommen von Tedit, tmemo etc. handelt, denen ein zusätzliches, gemeinsames Interface umgehängt werden soll. |
AW: Interfaces ohne Referenzzählung?
Dann könntest du auch bei Objekten bleiben.
Du leitest alle entsprechenden Komponenten von einem gemeinsamen Vorfahren ab, welcher IsValid als virtuelle Methode implementiert. |
AW: Interfaces ohne Referenzzählung?
Die Referenzzählung erfolgt nicht im Interface, sondern im Objekt das mit dem Interface verbunden deklariert wird. Automatisch implementiert ist das bei TInterfacedObject. Dazu kannst du dir den Quelltext anschauen, wie die Referenzzählung dort umgesetzt ist.
Dann weißt du auch wie man das abstellen kann (IInterface als Basis-Interface schreibt nur zwingend vor, dass die Methoden für die Referenzzählung implementiert werden müssen) |
AW: Interfaces ohne Referenzzählung?
@himitsu
Ich kann die Komponenten nicht von einen gemeinsamen Vorfahren ableiten weil es in Delphi ja keine Mehrfachvererbung gibt. Ich brauch Ableitungen von TEdit, TMemo, TCombobox etc. Und ich will in meinem abgeleiteten Formular einfach isvalid für alle Komponenten aufrufen, die das Interface implementieren (und true für alle anderen annehmen). @ Sir Rufo Danke, ich werde mir den Quellcode anschauen. Muss eigentlich ein Interface zwingend von IInterface abgeleitet werden? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 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