AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Interface Referenzzählung

Ein Thema von QuickAndDirty · begonnen am 4. Jun 2009 · letzter Beitrag vom 4. Jun 2009
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#1

Interface Referenzzählung

  Alt 4. Jun 2009, 12:39
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:
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;
Bei Programm ende wird nur der destruktor von MeinInterface aufgerufen nicht aber der von MeinObject.

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....
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 12:44
Zitat von QuickAndDirty:
1. Wieso?
Weil Referenzzählung nur für Interfaces gilt. Eine Klasse die von TInterfacedObject abgeleitet ist, stellt zwar alles Notwenidge für ein Interface bereit, ist aber selbst keins.

Zitat:
2. Kann ich das Ändern?
Klar, wenn du die Referenzzählung von Hand übernimmst. Der Compiler wird dir hierbei nicht helfen.

Zitat:
3. Was passiert bei Typecasts Classe zu Interface, Interface zu classe, kommt die Refernzzählung dann durcheinander?
Bei Klasse zu Interface wird der Referenzzähler um 1 erhöht. Interface zu Klasse erlaubt der Compiler schon mal nicht (man kann sich aber Abhilfe schaffen, ändert dann aber trotzdem nichts am Referenzzähler)



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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#3

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 13:22
Zitat von jbg:
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.
Das ist nicht gerade ein motivierender Lernerfolg!
Gibt es ein Class2Interface Tool, damit ich den public Teil wenigstens nicht ständig doppelt deklarieren muss?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 13:24
Zitat von jbg:
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.
Genau diesen Fall der gemischten Verwenudng von Interfaces und Objektreferenzen hat uns vor ein paar Jahren schon mal einige Tage gekostet. Also: Wenn Interfaces, dann immer nur über dieses Interface zugreifen!
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#5

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 13:25
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 13:51
Zitat von QuickAndDirty:
Zitat von jbg:
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.
Das ist nicht gerade ein motivierender Lernerfolg!
Gibt es ein Class2Interface Tool, damit ich den public Teil wenigstens nicht ständig doppelt deklarieren muss?
Ja: das Extract Interface Refactoring in der IDE. Einfach rechte Maustaste auf der Klassendeklaration und dann aus dem Kontextmenü wählen. Man kann die zu extrahierenden Methoden dann auch einzeln deaktivieren. Die Klasse erhält dann auch in der Deklaration das Interface.

Das sieht dann bei einem Formular so aus:

Delphi-Quellcode:
type
  IMainFrm = interface
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  procedure Button3Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  end;

  TMainForm = class(TForm, IMainFrm)
  ...
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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#7

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 14:19
Zitat von Phoenix:
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.
Mir gefällt aber gerade die Referenzzählung, und das ich mir über die Verwendung nach einer Freigabe und so "theoretisch" keine Sorgen machen muss. Und einige andere Sachen die evtl. einen eigenen Thread brauchen.
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 15:19
Eine Konvertierung hab ich noch nicht gefunden ... brauchst dir ja nur mal der verwurschtelten Code von Hier im Forum suchenhimXML ansehn, die Klassen in himXML.pas sind alle so konzipiert, daß sie entwerder als Klasse oder als Interfache kompiliert werden können und der Zugriff auf die objektinternen Variablen und Funktionen werden notfalls über ein zusätzliches internes Interface umgeleitet.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#9

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 16:26
Zitat von QuickAndDirty:
Bei Programm ende wird nur der destruktor von MeinInterface aufgerufen nicht aber der von MeinObject.
Der Destructor Destroy ist aus gutem Grund Virtual.
Wer einen Destructor mit eigenem Namen hinzufügt, sollte auch Destroy überschreiben und diesen dort aufrufen.

Zitat von QuickAndDirty:
Gibt es ein Class2Interface Tool, damit ich den public Teil wenigstens nicht ständig doppelt deklarieren muss?
Man könnte z.B. von einer Basisklasse ableiten, die schon das Standardverhalten für das erforderliche Interface implementiert.
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 ...
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#10

Re: Interface Referenzzählung

  Alt 4. Jun 2009, 16:37
Zitat von Blup:
Zitat von QuickAndDirty:
Bei Programm ende wird nur der destruktor von MeinInterface aufgerufen nicht aber der von MeinObject.
Der Destructor Destroy ist aus gutem Grund Virtual.
Wer einen Destructor mit eigenem Namen hinzufügt, sollte auch Destroy überschreiben und diesen dort aufrufen.
Willst du mich vera...... ? Was glaubst du wie ich wohl herausbekommen haben das der Destruktor NICHT aufgerufen wird?
"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 von Blup:
Zitat von QuickAndDirty:
Gibt es ein Class2Interface Tool, damit ich den public Teil wenigstens nicht ständig doppelt deklarieren muss?
Man könnte z.B. von einer Basisklasse ableiten, die schon das Standardverhalten für das erforderliche Interface implementiert.
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 ...
Stimmt CopyPaste und man muss beide immer selbstständig Synchron halten, imho ein kleiner Nachteil wenn man davon mal mehr hat oder
wenn man bereits viele Klassen hat die man jetzt als Interface braucht.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz