如何重载Delphi类函数

时间:2014-07-14 18:42:28

标签: delphi methods overloading

我有这样的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。

1 个答案:

答案 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