In meinem Fall war es einfach ein virtueller Constructor, wobei das auf alle virtuellen Methoden angewendet werden kann.
Es gibt eine Klasse, welche von einer anderen Klasse abgeleitet ist.
Nun ist hier ein neuer Contructor eingeführt, mit weiteren Parametern und es ist vorgesehen, daß weitere Nachfahren diesen neuen Contructor verwenden.
Intern wird der alte Contructor auf den neuen umgeleitet.
Nun ist es aber vorgesehen, daß diese Klasse öfters erweitert/abgeleitet wird und dabei soll einfach vermieden werden, daß die beiden Constructoren abwechseln überschrieben werden, was zur Folge hat, daß die Aufrufreihenfolge nicht mehr stimmt.
Delphi-Quellcode:
TMyClass0 = class()
procedure MethodA; virtual;
end;
TMyClass1 = class(TMyClass0)
procedure MethodA; overload;
procedure MethodB; virtual;
end;
TMyClass2 = class(TMyClass1)
procedure MethodB; overload;
end;
TMyClass3 = class(TMyClass2)
procedure MethodA; overload;
// eigentlich nicht "erlaubt", da es in MethodB gehören würde
end;
TMyClass4 = class(TMyClass3)
procedure MethodB; overload;
end;
procedure TMyClass1.MethodA;
begin
MethodB;
end;
procedure TMyClass1.MethodB;
begin
inherited MethodA;
end;
// und sonst jeweils inherited auf den eigenen Vorfahren
TMyClass1 ist meine Klasse, auf TMyClass0 hab ich keinen Einfluß und das ab TMyClass2 unterliegt auch nicht unbedingt meiner Kontrolle.
Ruft man jetzt MethodB auf, dann würden die Methoden in dieser Reihenfolge ausgeführt:
TMyClass4.MethodB
TMyClass2.MethodB
TMyClass3.MethodA
TMyClass1.MethodA
TMyClass0.MethodA
Wie man sieht ist 2 und 3 vertauscht.
Darum einfach die alte Methode für's Überschreiben sperren, damit man das nicht ausversehn macht.
Grund ist einfach, daß die Komponente für billiges
GUI-Geklicke mit Einstellung über den
OI
und für die direkte Verwendung im Code, über Parameter im Contructor, verwendet werden kann.
Wobei im Code, mit dem dem alten Constructor und über Property auch möglich wäre.
PS: sealed macht sich gut, wenn man eine öfentliche Klasse hat, von welcher aber nicht abgeleitet werden soll und die sich leider nicht privat deklarieren läßt, da man sie selber in mehreren Units benötigt.
PSS: Man hätte statt dem final die Methode einfach mit einer Nichtvirtuellen verdecken können, aber so ist es sauberer.