Habe folgendes getestet (mit Freepascal, Delphi steht mir im Moment nicht zur Verfügung):
Delphi-Quellcode:
program hilfe;
{$mode objfpc}{$H+}
uses SysUtils, Classes;
type
TKla1 = class
public
Feins: Longint;
end;
TKla2 = class(TKla1)
public
Fzwei: Longint;
end;
TKlasse1 = class
public
Ftest: TKla1;
constructor Create;
destructor Destroy; override;
end;
TKlasse2 = class(TKlasse1)
public
function GetTest: Longint;
end;
constructor TKlasse1.Create;
begin
Ftest := TKla1.Create;
Ftest.Feins := 10;
end;
destructor TKlasse1.Destroy;
begin
Ftest.Free;
inherited Destroy;
end;
function TKlasse2.GetTest: Longint;
var
ei: TKla2; // absolute Ftest;
begin
ei := TKla2(Ftest);
Ftest.Feins := 20;
Result := ei.Feins;
end;
var
bla: TKlasse2;
begin
bla := TKlasse2.Create;
WriteLn(Format('Test = %d', [bla.Ftest.Feins]));
WriteLn(Format('Test = %d', [bla.GetTest]));
WriteLn(Format('Test = %d', [bla.Ftest.Feins]));
bla.Free;
end.
Als Ergebnis bekomme ich:
Code:
Test = 10
Test = 20
Test = 20
Ersetze ich die Methode
TKlasse2.GetTest durch:
Delphi-Quellcode:
function TKlasse2.GetTest: Longint;
var
ei: TKla2; // absolute Ftest;
begin
ei := TKla2(Ftest);
ei.Feins := 20;
Result := FTest.Feins;
end;
dann erhalte ich ebenfalls
Code:
Test = 10
Test = 20
Test = 20
Das Typecasting verhält sich (zumindest bei diesem Test) genauso wie es sich mit
absolute verhalten sollte.
Allerdings habe ich jetzt nicht getestet, wie es mit Typen aussieht, die keine Objekte sind (z.B. Double <-> Int64).