OK. Alles klar. Jetzt weiß ich, wo meine Lücke war. Ich hatte den Fall so konkret noch nicht. Ich habe es immer vermieden die Nachfahren-Methoden aus dem Vorfahren heraus aufzurufen.
Ich habe Dein Lernbeispiel mal experimentell erweitert und ... naja, in Worte fassen kann ich es auch nicht. Das habe ich schon versucht. Aber ich habe es klar verstanden.
Delphi-Quellcode:
program test;
type
TA = class
procedure Test; virtual;
end;
TD1 = class( TA )
procedure Test; reintroduce;
end;
TD2 = class( TA )
procedure Test; override;
end;
TD3 = class( TD1 )
procedure Test; virtual;
end;
TD4 = class( TD3 )
procedure Test; override;
end;
procedure TA.Test;
begin
WriteLn( 'A' );
end;
procedure TD1.Test;
begin
WriteLn( 'D1' );
end;
procedure TD2.Test;
begin
WriteLn( 'D2' );
end;
procedure TD3.Test;
begin
WriteLn( 'D3' );
end;
procedure TD4.Test;
begin
WriteLn( 'D4' );
end;
var
Inst1 : TA;
Inst2 : TD3;
begin
Inst1 := TD1.Create;
try
Inst1.Test;
finally
Inst1.Free;
end;
Inst1 := TD2.Create;
try
Inst1.Test;
finally
Inst1.Free;
end;
Inst1 := TD3.Create;
try
Inst1.Test;
finally
Inst1.Free;
end;
Inst1 := TD4.Create;
try
Inst1.Test;
finally
Inst1.Free;
end;
Inst2 := TD3.Create;
try
Inst2.Test;
finally
Inst2.Free;
end;
Inst2 := TD4.Create;
try
Inst2.Test;
finally
Inst2.Free;
end;
end.
Alles klar! Ein wirklich interessantes Konstrukt. Die Frage ist nur, ob sowas Sinn macht. Wenn es einen wirklich wichtigen Anwendungsfall dafür gibt (HAHA), so sind Java und Andere im deutlichen Nachteil, da diese alle Methoden nativ als virtuell deklarieren.
Wikipedia :: Virtuelle Methoden
Vielen herzlichen Dank für den Codeschnipsel. Der erklärte mir alles.
Jetzt fällt mir nach 12 Jahren alles wieder ein.
Edit: Nun muss ich ja doch meine Methoden umbenennen. Sonst verbau ich mir eine Menge Möglichkeiten. So'n Mist!