![]() |
Interface Referenzzählung
Hallo liebe Delphianer,
ich habe gestern zu meinem Entsetzen festgestellt das die Referenzzählung von Objekten die ein IInterface implementieren NICHT gestartet wird wenn man sie einer Objectvariable zuweist. bzw. diese wieder freigibt... Also
Delphi-Quellcode:
Bei Programm ende wird nur der destruktor von MeinInterface aufgerufen nicht aber der von MeinObject.
Programm bla;
uses alles; type IMyinterface = Interface(IInterface) bla end; TMyInterfacedObject= class(Tinterfacedobject, IMyInterface) bla end; var meinObjekt: TMyInterfacedObject; meinInterface: IMyInterface; Begin meinObject := TMyInterfacedobject.create; meinInterface := TMyInterfacedobject.create; end; 1. Wieso? 2. Kann ich das Ändern? 3. Was passiert bei Typecasts Classe zu Interface, Interface zu classe, kommt die Refernzzählung dann durcheinander? 4. ...äh..scheiße nochmal, warum geht das bei MeinObject nicht.... |
Re: Interface Referenzzählung
Zitat:
Zitat:
Zitat:
Ach ja: Du hast gerade herausgefunden, warum man Interfaces mit Objektreferenzen nicht mischen soll: Die Referenzzählung spielt verrückt und die Objektreferenz oder das Interface zeigen auf ein nicht mehr vorhandenes Objekt. |
Re: Interface Referenzzählung
Zitat:
Gibt es ein Class2Interface Tool, damit ich den public Teil wenigstens nicht ständig doppelt deklarieren muss? |
Re: Interface Referenzzählung
Zitat:
|
Re: Interface Referenzzählung
Ich persönliche mache es so:
Ich erstelle ein Interface-Objekt das KEINE Referenzzählung implementiert, und behandele es wie ein Objekt. Das heisst ich kümmere mich selber um die Freigabe. Es geht hier ja nicht um COM-Interfaces sondern um eigene, und da hast Du das Verhalten selber in der Hand. |
Re: Interface Referenzzählung
Zitat:
Das sieht dann bei einem Formular so aus:
Delphi-Quellcode:
Refactorings sind für manche der einzige Grund, auf eine neuere Version zu wechseln - was man da bei grossen Projekten an Zeit spart, gleicht die längere Startzeit der IDE locker aus :)
type
IMainFrm = interface procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); end; TMainForm = class(TForm, IMainFrm) ... |
Re: Interface Referenzzählung
Zitat:
Das reale InterfacedObject zu dem Beispiel ist übrigens ein ILogFile/TLogFile. Das schöne ist das ich wenn es einmal erstellt ist alles Loggen kann, alles bis zu letzt ohne wissen zu müssen wo ich das Objekt/interface am besten freigebe. |
Re: Interface Referenzzählung
Eine Konvertierung hab ich noch nicht gefunden ... brauchst dir ja nur mal der verwurschtelten Code von
![]() |
Re: Interface Referenzzählung
Zitat:
Wer einen Destructor mit eigenem Namen hinzufügt, sollte auch Destroy überschreiben und diesen dort aufrufen. Zitat:
Oder auch entsprechend Hilfe "Implementieren von Schnittstellen durch Delegation". Ansonsten Copy + Paste für die Deklaration und Shift + Strg + C um die Methodenrümpfe zu erstellen. Dann gibts noch solche Sachen wie ModelMaker ... |
Re: Interface Referenzzählung
Zitat:
"BLA" enthält natürlich einen Überschriebenen Destruktor und dieser ist natürlich auch implementiert. Und natürlich ist das nur mal QuickAndDirty dahingetippt , ich wollte das mitlerweile 620 K Kodezeilen lange Programm nicht vollständig Posten, auch wenn so natürlich einige Dinge aus dem Zusammenhang gerissen erscheinen, MEA CULPA. Zitat:
wenn man bereits viele Klassen hat die man jetzt als Interface braucht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 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