当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在重写的虚函数中调用`Inherited`祖先方法?》经验,为你挑选了3个好方法。

这有效:

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;

Nick Hodges.. 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> Nick Hodges..:

这是正确的答案.

正如您在上面提到的那样,正确的方法是:

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;

语言不支持您希望这样做的方式.

所以最终回答你的问题"为什么这不起作用?" 是因为这不是语言的设计方式.


但这是一个自然的假设.除了函数之外,它适用于所有内容 - 当你查看文档时,它引用了'方法',对我而言,这意味着函数,过程,构造函数和析构函数.

2> Lars Truijen..:

当您需要方法的结果时,自动参数传递不起作用.你需要填写方法名和参数,抱歉.



3> gabr..:

至于为什么不支持它,几年前哈尔瓦德在他的博客中写了一个似是而非的解释:

一个警告与"继承;" 语法是函数不支持它.对于函数,您必须使用显式语法,包括方法名称和任何参数.例如:

[部分代码]

这可能看起来像Delphi语言设计中的疏忽,但我认为这是故意的.它背后的基本原理可能是,如果TMyClass.MethodC是抽象的(或将来是抽象的),后代类中的Result赋值将被删除,因此Result突然未定义值.这肯定会导致微妙的错误.


因为你可以调用继承; 如果祖先中没有匹配的函数,则简单地忽略该语句.但是如果你使用继承的Method(); 并且祖先类中没有匹配方法会导致编译时错误.基于那个人会期望Result:= inherited; 如果没有要继承的方法来调用,则会被忽略.但是这会使Result未分配.不调用过程没有副作用,不调用函数也会删除赋值.
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有