Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zirkuläre Unit Reference (https://www.delphipraxis.net/81293-zirkulaere-unit-reference.html)

negaH 28. Nov 2006 00:43

Re: Zirkuläre Unit Reference
 
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

Koolance 28. Nov 2006 13:18

Re: Zirkuläre Unit Reference
 
Erst mal vielen Dank für deine ausführlichen Antworten. Habe wieder echt was gelernt.

Zitat:

Wenn du davon überzeugt bist warum fragst du dann noch ? Ich meine, und damit bin ich nicht der Einzigste hier, das du mit dieser Meinung schon von vornherein deinen größten Fehler begehst. Begründungen siehe oben.
Ganz sicher war ich mir wohl doch noch nicht... :?
Die Interfacelösung habe ich verworfen.
Die Lösung über TObject habe ich ausprobiert und sie funktioniert sehr gut. :hello:

Die 3 Klassen-Lösung muss ich mal Komplett durchdenken, ich bin mir noch nicht sicher ob ich mit so mein Problem lösen kann.

negaH 28. Nov 2006 14:50

Re: Zirkuläre Unit Reference
 
Zitat:

Die 3 Klassen-Lösung muss ich mal Komplett durchdenken, ich bin mir noch nicht sicher ob ich mit so mein Problem lösen kann.
Sinnvoll ist es darüber nachzudenken, aber je nach Notwendigkeiten lassen sich bestimmte Konstrukte nicht vermeiden. Und in diesem Moment benötigst du wieder Typcasts. Wichtig ist dann nur das du per as Typcastest auch wenn das bischen langsammer geht, dafür absolut sicher ;)

Der Aufwand über abstrakte Vorfahrklassen ist nicht unerheblich, das muß man fairerweise sagen, und eben auch öfters nicht immer sauber umsetzbar. Auch da können dann Typcasts vorkommen.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.
Seite 3 von 3     123   

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