Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#21

Re: Zirkuläre Unit Reference

  Alt 28. Nov 2006, 00:43
Zitat:
Warum ist das casten unzulässig?
Ein harter Cast, wie der in deinen Sourcen, ist generell unzulässig und absolut sinnfrei. Denn der Zeiger auf ein Interfaces ist immer unterschiedlich auf den Zeiger der implementerenden Klasse. Das mag für C++ Interfaces die direkt auch die implementieren de Klase darstellen anders sein (der einzgste Fall den ich kenne wo dies so ist). Aber bei Interfaces implementiert durch Borland Delphi PASCAL Klassen ist definitiiv der Zeiger auf ein Interface NICHT identisch mit dem Zeiger auf die Klasse.

Defakto ist der Zeiger auf das Interface ein Zeiger mit festen Offset relativ zum Zeiger auf die implementierende Instance der Klasse. Nachzulesen in Unit TypInfo.pas. Implementiert eine Klasse in Delphi sogar mehere Schnittstellen unterschiedlichen Types so unterscheiden sich sogar all diese Zeiger dieser Interfaces !!

Beispiel
Delphi-Quellcode:

type
  IInterface1 = interface;
  IInterface2 = interface;

  TMyImpl = class(TInterfacedObject, IInterface1, IInterface2)

var
  MyImpl: TMyImpl;
  MyInt1: IInterface1;
  MyInt2: IInterface2;
begin
  MyImpl := TMyImpl.Create;
  MyInt1 := MyImpl as IInterface1;
  MyInt2 := MyImpl as IInterface2;

  if (Pointer(MyImpl) = Pointer(MyInt1)) then // ist FALSE
  if (Pointer(MyImpl) = Pointer(MyInt2)) then // ist FALSE
  if (Pointer(MyInt1) = Pointer(MyInt2)) then // ist FALSE

// ergo:
  
  IInterface1(MyImpl).XYZ; // ist FALSCH
  IInterface2(MyImpl).XYZ; // ist FALSCH
  
  TMyImpl(MyInt1).XYZ; // ist FALSCH
  TMyImpl(MyInt2).XYZ; // ist FALSCH

  (MyImpl as IInterface1).XYZ; // ist RICHTIG, wenn IInterface1 eine GUID hätte, hat
  (MyImpl as IInterface2).XYZ; // ist RICHTIG, wenn IInterface2 eine GUID hätte, hat


  (MyInt1 as TMyImpl).XYZ; // ist FALSCH, da ein Interface keinen spzifischen Typ eines Implementor kennt, siehe Abstraktion oben
  (MyInt2 as TMyImpl).XYZ; // ist FALSCH, ....
end;
Ergo: die Frage ist nicht "warum unzulässig" sondern "überhaupt möhglich ?", und nein ist es nicht und erzeugt nur AVs und sonst nichts. Du versuchst nämlich damit nur aus einem Auto die Farbe Grün zu machen ohne irgendwelche Überprüfungen

Gruß Hagen
  Mit Zitat antworten Zitat