AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Klatsch und Tratsch Was nervt euch so, während der Programmierung oder so allgemein

Was nervt euch so, während der Programmierung oder so allgemein

Ein Thema von himitsu · begonnen am 26. Jun 2010 · letzter Beitrag vom 3. Mai 2013
Thema geschlossen
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 17:41
Extrem nerven tut es, daß _AddRef und _Release nie als virtual deklariert sind. (QueryInterface ist es allerdings fast immer)

Wie soll man denn da nachträglich eine Referenzzählung implementieren, wo es vorher keine gab (diese Funktionen machen nichts), bzw. wie soll man da das Verhalten ändern können.
Überschreib die Methoden und setz in die Klassendefinition nochmals IInterface. Dann werden die 3 Methoden aus dieser Klasse benutzt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
 
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 17:43
Digital River. Nie wieder!
 
Benutzerbild von himitsu
himitsu

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

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 19:57
Hi Stevie,

seit man aber Interfaces wieder in Objekte zurückcasten kann (IInterfaceComponentReference sei Dank ... die haben mir meine Idee geklaut ),
ist dieses nicht mehr sicher, denn wenn man dann auf das ältere Klasse castet und dann wieder in ein Interface, dann wird das Interface des Vorfahren und nicht das Neue verwendet.

Und IInterfaceComponentReference zu überschreiben hatte keinerlei Wirkung, sonst hätt' ich da einfach NIL zurückgegeben.

Delphi-Quellcode:
type
  TMyClass1 = class(TObject, IInterface)
    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

  TMyClass2 = class(TMyClass1, IInterface)
    function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i1, i2, i3, i4, i5, i6: IInterface;
  o5: TMyClass1;
  o6: TMyClass2;
begin
  Memo1.Lines.Add('');
  Memo1.Lines.Add('o6 := TMyClass2.Create / i6 := TMyClass2(o6) as IInterface');
  o6 := TMyClass2.Create;
  i6 := o6 as IInterface;
  i6._AddRef;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('o5 := TMyClass2.Create; / i5 := TMyClass1(o5) as IInterface;');
  o5 := TMyClass2.Create;
  i5 := o5 as IInterface;
  i5._AddRef;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('i1 := TMyClass1.Create;');
  i1 := TMyClass1.Create;
  i1._AddRef;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('i2 := TMyClass2.Create;');
  i2 := TMyClass2.Create;
  i2._AddRef;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('i3 := TMyClass2(i2) as TMyClass2;');
  i3 := i2 as TMyClass2;
  i3._AddRef;

  Memo1.Lines.Add('');
  Memo1.Lines.Add('i4 := TMyClass2(i2) as TMyClass1;');
  i4 := i2 as TMyClass1;
  i4._AddRef;

  Memo1.Lines.Add('');
end;

{ TMyClass1 }

function TMyClass1.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  Form1.Memo1.Lines.Add('TMyClass1.QueryInterface');
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TMyClass1._AddRef: Integer;
begin
  Form1.Memo1.Lines.Add('TMyClass1._AddRef');
end;

function TMyClass1._Release: Integer;
begin
  Form1.Memo1.Lines.Add('TMyClass1._Release');
end;

{ TMyClass2 }

function TMyClass2.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  Form1.Memo1.Lines.Add('TMyClass2.QueryInterface');
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TMyClass2._AddRef: Integer;
begin
  Form1.Memo1.Lines.Add('TMyClass2._AddRef');
end;

function TMyClass2._Release: Integer;
begin
  Form1.Memo1.Lines.Add('TMyClass2._Release');
end;

end.




o6 := TMyClass2.Create / i6 := TMyClass2(o6) as IInterface
TMyClass2.QueryInterface
TMyClass2._AddRef
TMyClass2._AddRef

o5 := TMyClass2.Create; / i5 := TMyClass1(o5) as IInterface;
TMyClass1.QueryInterface // ist QueryInterface nicht virtual kommt hier TMyClass1.QueryInterface rause
TMyClass2._AddRef
TMyClass2._AddRef

i1 := TMyClass1.Create;
TMyClass1._AddRef
TMyClass1._AddRef

i2 := TMyClass2.Create;
TMyClass2._AddRef
TMyClass2._AddRef

i3 := TMyClass2(i2) as TMyClass2;
TMyClass2.QueryInterface
TMyClass2._AddRef
TMyClass2._AddRef

i4 := TMyClass2(i2) as TMyClass1;
TMyClass2.QueryInterface
TMyClass1._AddRef
TMyClass1._AddRef

TMyClass2._Release
TMyClass2._Release
TMyClass1._Release
TMyClass2._Release
TMyClass2._Release
TMyClass1._Release
Ein Therapeut entspricht 1024 Gigapeut.
 
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.460 Beiträge
 
Delphi 12 Athens
 
#4

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 20:26
@himi...

wenn wir hier einen Counter hätten, würdest du den genervten Record halten... Paß auf deine Gesundheit auf, damit nicht in ein paar Jahren ein Bypaß dich verschönert Man muß sich nicht über alles aufregen. Manchmal einfach nur akzeptieren...
 
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 21:52
seit man aber Interfaces wieder in Objekte zurückcasten kann (IInterfaceComponentReference sei Dank ... die haben mir meine Idee geklaut ),
ist dieses nicht mehr sicher, denn wenn man dann auf das ältere Klasse castet und dann wieder in ein Interface, dann wird das Interface des Vorfahren und nicht das Neue verwendet.
So ne Schei... macht man ja auch nicht! Oder man schaltet sein Hirn an bevor man wirres Zeugs codet.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
 
Benutzerbild von himitsu
himitsu

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

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 21:56
Die Klasse ist für etwas, was hier mal veröffentlicht wird ... Und was hier für Irre rumlaufen, kann ich mir jetzt noch garnicht ausdenken.
Allerdings könnte man sich über diese Lib die Delphi-IDE lahmlegen und das wollte ich minimieren.
Ein Therapeut entspricht 1024 Gigapeut.
 
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 22:01
Dass man non ref counted interfaces haben will, ist ja noch plausibel, aber dass man TComponent Derivate mit Refcounting ausstatten will, kann ich nicht ganz verstehen, denn genau damit kannst du ganz böse Überraschungen erleben. Das TComponent livetime management wird nunmal über den Owner geregelt und nicht über das Interface. Beides zu mischen wird über kurz oder lang in die Hose gehen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
 
Benutzerbild von himitsu
himitsu

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

AW: Was nervt euch so, wärend der Programmierung oder so allgemein

  Alt 2. Nov 2011, 22:10
Deswegen hab ich mir ja ein entsprechendes Verhalten ausgedacht, welches den Referenzzähler und die Objektreferenz beachtet ... erst wenn Beides freigeben ist, wird alles aufgeräumt.

Denn es ist vorgesehn diese Klassen gleichzeitig in der VCL und als Interface zu nutzen und ich wollte mir eben doppelte Arbeit ersparen, das als Interface zu machen und dann nochmal 'ne Containerklasse für die VCL bereitzustellen.
Ein Therapeut entspricht 1024 Gigapeut.
 
Thema geschlossen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Untitled document This thread Refback 7. Nov 2011 09:54

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 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