这有效:
constructor TMyObj.Create;
begin
inherited;
end;
为什么这也不起作用?
function TMyObjEx.Import(CONST FileName: string; CONST x, y, z: Integer): string;
begin
result:= inherited; // Import(FileName, x, y, z); <--- Compiler says: "incompatible types"
//do other stuff here
end;
TMyObjEx的声明是这样的:
TYPE
TMyObj = class(TChObj)
private
protected
public
function Import (CONST FileName: string; CONST x, y, z: Integer): string; virtual;
end;
TMyObjEx= class(TMyObj)
private
protected
public
function Import(CONST FileName: string; CONST x, y, z: Integer): string; override;
end;
答案 0 :(得分:10)
这是正确的答案。
正如您在上面提到的那样,正确的方法是这样做:
function TMyObjEx.Import(CONST FileName: string; CONST x, y, z: Integer): string;
begin
result:= inherited Import(FileName, x, y, z);
//do other stuff here
end;
语言不支持您想要这样做的方式。
所以最终回答你的问题“为什么这不起作用?”是因为这不是语言的设计方式。
答案 1 :(得分:8)
当您需要方法的结果时,自动参数传递不起作用。你需要填写方法和参数的名称,抱歉。
答案 2 :(得分:6)
至于为什么它不受支持,几年前哈尔瓦德在他的博客中写了plausible explanation:
对“继承”的一个警告语法是函数不支持它。对于 函数必须使用显式语法,包括方法名和任何参数。 例如:
[部分代码]
这可能看起来像Delphi语言设计中的疏忽,但我认为是 商榷。其背后的基本原理可能是,如果TMyClass.MethodC是抽象的(或 在未来取得了抽象),后代课程中的结果分配将是 删除,因而结果突然未定义值。这肯定会导致微妙的 错误。
答案 3 :(得分:1)
起初我认为如果你对函数的结果不感兴趣,你可以使用inherited
,但事实并非如此。调用继承的函数方法需要方法名称和参数。就是那样子。如果您从当前方法接收的参数中传递不同的参数,或者您正在调用完全不同的方法,则还需要提及方法名称。
答案 4 :(得分:-1)
似乎德尔福文件还有另一个黑洞......(噢,这是什么好消息?)
我的测试表明,只有构造函数,析构函数和过程方法才能使用继承的关键字。在功能方法中,它不起作用 AT ALL 。
但是,我从未检测到它,因为我习惯于完全调用继承的方法,即使我不需要它(动机:能够使用 Ctrl +左键单击并且无需调试即可更轻松地遵循代码流程。