AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Interface referenzen auf gleichheit prüfen?
Thema durchsuchen
Ansicht
Themen-Optionen

Interface referenzen auf gleichheit prüfen?

Ein Thema von maximov · begonnen am 11. Okt 2004 · letzter Beitrag vom 14. Okt 2004
 
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Interface referenzen auf gleichheit prüfen?

  Alt 11. Okt 2004, 14:43
Hallo Maximov,

wie Hagen bereits dargestellt hat, handelt es sich bei Schnittstellen (Interfaces) um unterschiedliche "Sichten" auf ein und dasselbe Objekt. Weil die Identität eines Objekts jedoch ein Wesensmerkmal darstellt, scheint es tatsächlich überaschend, dass der von Dir diskutierte Code bei einen Vergleich der Art
Delphi-Quellcode:
myObj := TMyClass.Create;
myRefToInterfaceA := myObj;
myRefToInterfaceBA := myObj;
Result := Pointer(myRefToInterfaceA) = Pointer(myRefToInterfaceB);
den Wert False zurückgibt.

Tatsächlich ist dies lediglich spezifisch für Wahl der Implementierung von Interfaces im COM-Umfeld, bei der jede Klasse für jedes implementierte Interface seine eigene "Methodentabelle" bereitstellt, auf die (indirekt) durch die Referenz auf ein Interface verwiesen wird.
Obgleich es möglich ist, Schnittstellen voneinander erben zu lassen und Zuweisungen der Art
Delphi-Quellcode:
type
  IMyInterface = interface
  ['{A GUID}']
  end;

  IMyInterfaceDescendant = interface(IMyInterface)
  ['{Another GUID}']
  end;

  TMyClass = class(TInterfacedObject, IMyInterfaceDescendant)
  end;

var
  myObject: TMyClass;
  myRefToInterface: IMyInterface;
  myRefToInterfaceDescendant: IMyInterfaceDescendant;
begin
  myObject := TMyClass.Create;
  myRefToInterfaceDescendant := myObject;
  myRefToInterface := myRefToInterfaceDescendant;
durchzuführen, obwohl die Klasse TMyClass aus dem Beispiel das Interface IMyInterface selbst nicht implementiert, ist eine Zuweisung der Art
myRefToInterface := myObject nicht zulässig wie auch der Cast
myObject as IMyInterface zu einer Exception führt: Das Interface IMyInterface wird von TMyClass nicht implementiert, es kann keine Referenz auf die "Methodentabelle" zurückgegeben werden.


Was Du also machen kannst, wenn Du ohne "Identitätsinterface", wie Hagen es vorschlägt, an die Identität der Objekte zweier unterschiedlicher Interfaces herankommen möchtest, ist der Cast auf auf ein gemeinsames Interface, z.B. IInterface, und der anschließende Vergleich der Art
Result := (myRefToAnInterface as IInterface) = (myRefToAnotherInterface as IInterface) Achtung: Wie oben beschrieben sind Zuweisungen zu Vorfahren-Interfaces gültig, also im Speziellen Zuweisungen zum Wurzelinterface IInterface. Ein Vergleich nach
Delphi-Quellcode:
var
  myHelper1: IInterface;
  myHelper2: IInterface;
begin
  myHelper1 := ARefToAnInterface;
  myHelper2 := ARefToAnnotherInterface;
  Result := myHelper1 = myHelper2;
kann demnach zu fehlern führen!
gruß, choose
  Mit Zitat antworten Zitat
 


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 16:20 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