Wie der Titel schon sagt wollte ich gern eine virtuelle statische Methode( genauer gesagt eine Funktion) in einer abgeleiteten Klasse überschreiben.
Soweit funktioniert das eigentlich auch.
https://www.freepascal.org/docs-html/ref/refsu28.html
Hier steht ja auch:
Note that class methods can be virtual, and can be overridden.
Jedoch funktioniert das anscheinend nur "teilweise", da in meinem Projekt ein Fehler auftritt, da nicht die abgeleitete Funktion verwendet wird.
Ich habe dann im Web gesucht und leider nur sehr wenig Infos bekommen. Genau genommen keine die mein Problem gelöst hat.
Daher habe ich dann mal ein kleines Test programm geschrieben, welches deutlich zeigt das virtuelle statische funktionen zwar überschrieben werden aber nicht immer verwendet werden.
Code: Alles auswählen
program Virtual_Static_Methods;
type
{ TBase }
TBase = class
public
class function StaticFunction: Boolean; virtual; static;
class function GetValueOfStaticFunction: Boolean; static;
function NormalFunction: Boolean; virtual;
function GetValueOfNormalFunction: Boolean;
end;
{ TDerived }
TDerived = class(TBase)
public
class function StaticFunction: Boolean; override; static;
function NormalFunction: Boolean; override;
end;
{ TBase }
class function TBase.StaticFunction: Boolean;
begin
Result:=false;
end;
class function TBase.GetValueOfStaticFunction: Boolean;
begin
Result:=StaticFunction;
end;
function TBase.NormalFunction: Boolean;
begin
Result:=false;
end;
function TBase.GetValueOfNormalFunction: Boolean;
begin
Result:=NormalFunction;
end;
{ TDerived }
class function TDerived.StaticFunction: Boolean;
begin
Result:=true;
end;
function TDerived.NormalFunction: Boolean;
begin
Result:=true;
end;
var
Base: TBase;
begin
WriteLn('Test virtual static methods');
Base:=TDerived.Create;
Write('call Base.StaticFunction: ');
WriteLn(Base.StaticFunction); // liefert TRUE
Write('call Base.GetValueOfStaticFunction: ');
WriteLn(Base.GetValueOfStaticFunction); // liefert FALSE
Write('call Base.NormalFunction: ');
WriteLn(Base.NormalFunction); // liefert TRUE
Write('call Base.GetValueOfNormalFunction: ');
WriteLn(Base.GetValueOfNormalFunction); // liefert TRUE
Base.Free;
ReadLn;
end.
Allerdings wird bei der GetValueOfStaticFunction Funktion nicht die abgeleitete Funktion StaticFunction verwendet. Daher ist das Ergebnis dann FALSE.
Als Gegen-Test gibt es noch eine nicht-statischte (normale) Function. Hier wird immer die abgeleitete Funktion verwendet.
Ist das so beabsichtigt oder ist es ein bug?