相关疑难解决方法(0)

Delphi:方法'Create'隐藏了基础的虚拟方法 - 但它就在那里

考虑假设的对象层次结构,从以下开始:

TFruit = class(TObject)
public
    constructor Create(Color: TColor); virtual;
end;
Run Code Online (Sandbox Code Playgroud)

及其后代:

TApple = class(TFruit)
public
    constructor Create(); overload; virtual;
    constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain
end;
Run Code Online (Sandbox Code Playgroud)

这里的想法是我已经覆盖了基类的构造函数,其重载也恰好是虚拟的.

德尔福抱怨:

方法'Create'隐藏基类型'TFruit'的虚方法

除了它不隐藏它 - 它就在那里!

  • 覆盖了祖先中的虚拟方法,并且
  • 我用另一个版本重载了

这是怎么回事?

delphi overloading

20
推荐指数
2
解决办法
1万
查看次数

隐藏基类的虚方法有什么问题?

我一直在收到关于Delphi编译器的警告 Method 'Create' hides virtual method of base.

我已经回顾了几个Stack Overflow链接(见下文),我不明白这个警告背后的逻辑,以及为什么它被认为是错误的编码实践.我希望别人能帮助我理解

我将包含一些示例代码:

type    
  TMachine = class(TPersistent)
  private
  public
    Horsepower : integer;
    procedure Assign(Source : TMachine);
  end;

...

procedure TMachine.Assign(Source : TMachine);
begin
  inherited Assign(Source);
  Self.Horsepower := Source.HorsePower;
end;
Run Code Online (Sandbox Code Playgroud)

这会导致编译器警告.

[dcc32 Warning] Unit1.pas(21): W1010 Method 'Assign' hides virtual method of base type 'TPersistent'
Run Code Online (Sandbox Code Playgroud)

我一直忽视这个警告,因为它对我没有任何意义.但这让我以另一种方式遇到了麻烦(请参阅我在这里的另一篇文章:为什么Delphi在动态对象创建过程中会调用错误的构造函数?)所以我决定尝试更好地理解这一点.

我知道如果我使用保留字reintroduce,错误就会消失,但我已经看到它反复发布这是一个坏主意.正如Warren P在这里所写的那样(德尔福:方法'创造'隐藏基础的虚拟方法 - 但它就在那里),"恕我直言,如果你需要重新引入,你的代码闻起来很可怕".

我想我理解"隐藏"是什么意思.正如David Heffernan在这里所说的那样(导致"W1010方法'%s'隐藏基类型'%s'的虚拟方法"的原因是什么?):

隐藏的含义是,从派生类中,您不再能够访问基类中声明的虚方法.您不能引用它,因为它与派生类中声明的方法具有相同的名称.后一种方法是从派生类中可见的方法.

但我有点困惑,因为似乎祖先方法并没有真正隐藏,因为派生类总是只能使用inherited关键字来调用基类中的方法.所以'隐藏'真的意味着'有些隐藏'吗?

我想我也明白使用保留字override会阻止编译器警告,但程序签名必须相同(即没有新添加的参数).我不能在这里使用它.

我不明白为什么隐藏是值得警告的.在我上面的代码示例中,我不希望用户TMachine.Assign()以某种方式使用TPersistent.Assign().在我的扩展课程中,我扩展了需求,因此希望他们使用新的和改进的功能.因此,隐藏旧代码似乎正是我想要的.我对 …

delphi oop polymorphism inheritance

8
推荐指数
1
解决办法
916
查看次数

标签 统计

delphi ×2

inheritance ×1

oop ×1

overloading ×1

polymorphism ×1