如何在重写的虚函数中调用`Inherited`祖先方法?

时间:2008-12-04 14:53:47

标签: delphi

这有效:

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;

5 个答案:

答案 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 +左键单击并且无需调试即可更轻松地遵循代码流程。