我有这样的Delphi(2007)类函数:
Class Function InitGlobal : TForm; Overload; Virtual; Abstract;
在某些后代课程中,我尝试:
Class Function InitGlobal : TDescendentForm; Overload; Override;
但Delphi抱怨TDescendentForm.InitGlobal
与之前的声明不同(尽管存在“Overload”指令)。
我猜函数结果类型不能重载。如果有的话,定义这种重载的正确方法是什么?
我检查了 Function overloading by return type? ,但它提到了进行此类重载的缺点和优点,而没有提到Delphi。
答案 0 :(得分:3)
函数重载只能基于参数,而不能基于返回值。没有办法让你有两个只有它们的返回值不同的重载。
还有什么,即使您可以这样做,您也会尝试使用override
,并更改功能的签名。那也是不可能的。覆盖必须与被覆盖的函数具有相同的签名。
您可以做的是覆盖该功能,并保持相同的签名。您可以删除overload
指令。然后你的派生函数看起来像这样:
class function InitGlobal: TForm; override;
现在,没有什么可以阻止你返回TDescendentForm
的实例。那还是TForm
。你在这里要做的是在运行时返回一个更多的派生类型。
实现可能如下所示:
Result := TDescendentForm.Create(...);
// compile time type of Result is TForm, but that is assignment compatible
// at run time with an instance of TDescendentForm