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