Ein Typcast ist ein "betrachte dieses Objekt als XYZ", dabei wird aber das selbe objekt (also der selbe Pointer) verwendet. Bei Vererbung klappt das auch wunderbar weil da es keine Mehrfachvererbung gibt, und die Elterndaten einfach das Prefix des Objektes sind, der Pointer identisch ist.corpsman hat geschrieben: Do 15. Mai 2025, 14:48 Weis jemand warum der Typecast nicht geht ? Bisher dachte ich immer dass der Unterschied zwischen dem Typecast und des "as" Operators nur der ist, das beim "as" der Compiler im hintergrund eine "versteckte" Prüfung einbaut und ggf. ne Exception wirft sollte es nicht compatibel sein...
Also wenn eine TStringList auf Addresse 1234 liegt, dann ist die instanz parent klasse TStrings die ersten paar bytes also z.B. 1234-1294 und die TStringList elemente folgen dann danach.
Bei Interfaces ist das nicht so, weil Interfaces in verschiedenen objekten vorkommen können, kann man da nicht einfach eine fixe umrechnung machen. Stattdessen muss zur Laufzeit in einer Tabelle nachgeschaut werden wo die Interface Daten liegen. Das macht der "as" operator.
Deshalb funktioniert kein Typecast
Beispiel:
Code: Alles auswählen
type
IMyInterface = Interface
['{B08E4496-0A99-40F6-9F11-02811A0393BF}']
end;
TMyClass = class(TInterfacedObject, IMyInterface)
end;
var
c: TMyClass;
begin
c:=TMyClass.Create;
WriteLn('Raw Pointer: ', IntPtr(c));
WriteLn('Parent Pointer: ', IntPtr(TInterfacedObject(c)));
WriteLn('Interface Pointer: ', IntPtr(c as IMyInterface));
end.
Code: Alles auswählen
Raw Pointer: 21702360
Parent Pointer: 21702360
Interface Pointer: 21702376