Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Interfaces ohne Referenzzählung? (https://www.delphipraxis.net/155315-interfaces-ohne-referenzzaehlung.html)

idefix2 18. Okt 2010 12:16

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.

sirius 18. Okt 2010 12:31

AW: Interfaces ohne Referenzzählung?
 
Benutze nicht TInterfacedObject und implementiere die entsprechenden Methoden selbst.

Sir Rufo 18. Okt 2010 12:33

AW: Interfaces ohne Referenzzählung?
 
Hmmm, also mal sehen was da mit einem normalen TObject passiert:
Delphi-Quellcode:
foo := TMyObject.Create;
foo := nil;
Die Instanz von TMyObject ist jetzt unwiederbringlich verloren ... weil wir haben den Kontakt verloren.
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.

Panthrax 18. Okt 2010 12:50

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.

Sir Rufo 18. Okt 2010 13:00

AW: Interfaces ohne Referenzzählung?
 
Zitat:

Zitat von Panthrax (Beitrag 1056309)
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.

Wenn ich alle Referenzen entfernt habe, dann hat die übergeordnete Komponente immer noch eine Referenz ... somit ist die Referenzzählung auch nicht auf 0, logisch erfolgt da keine Freigabe, weil de facto nicht alle Referenzen verschwunden sind

Bummi 18. Okt 2010 14:31

AW: Interfaces ohne Referenzzählung?
 
wenn Du eine weniger fette Basisklasse suchst:
TInterfacedPersistent

idefix2 18. Okt 2010 15:39

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.

himitsu 18. Okt 2010 15:42

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.

Sir Rufo 18. Okt 2010 15:46

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)

idefix2 18. Okt 2010 16:01

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.
Seite 1 von 2  1 2      

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