Delphi-PRAXiS

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?

Sir Rufo 18. Okt 2010 16:03

AW: Interfaces ohne Referenzzählung?
 
IInterface ist wie das TObject bei Klassen, davon wird immer abgeleitet

himitsu 18. Okt 2010 16:03

AW: Interfaces ohne Referenzzählung?
 
In Delphi ja ... wenn man kein Vorfahreninterface angibt, dann wird automatisch IInterface genommen.

Blup 19. Okt 2010 07:20

AW: Interfaces ohne Referenzzählung?
 
Zitat:

Zitat von idefix2 (Beitrag 1056358)
@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.

Da es sich bei diesen Klassen um Ableitungen von TComponent handelt, ist die Referenzzählung sowieso schon ausgeschalten. Das hat Panthrax bereits geschrieben.

himitsu 19. Okt 2010 08:31

AW: Interfaces ohne Referenzzählung?
 
Zitat:

Zitat von Blup (Beitrag 1056402)
Da es sich bei diesen Klassen um Ableitungen von TComponent handelt, ist die Referenzzählung sowieso schon ausgeschalten. Das hat Panthrax bereits geschrieben.

Nee, ich hatte gemeint dieses ganz normal als virtuelle Methode zu implementieren und nicht über Interfaces, aber dieser Weg ist ja nun eh nicht gewollt.

idefix2 19. Okt 2010 13:30

AW: Interfaces ohne Referenzzählung?
 
Das hat nichts mit "nicht gewollt" zu tun.

Ich habe einige verschiedene Komponenten, die zusätzliche Methoden implementieren. Wenn das Formular alle Komponenten durchgeht, soll es auf einfache Weise feststellen können, welche Komponenten diese Methoden implementieren und welche nicht, und die gleichen Methoden in den völlig verschiedenen Klassen auf einfache Art aufrufen können. Dafür eignet sich meines Wissens eigentlich nur die "supports" Funktion und das Interface-Konzept, alles andere wäre doch wesentlich komplizierter, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 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