【问题标题】:delphi overload, override, virtual methoddelphi 重载,覆盖,虚方法
【发布时间】:2013-05-25 04:29:42
【问题描述】:

具有如下所示的简单对象层次结构

TLiveThing=class
protected
 FTest:string;
 constructor Create(whereLive:string);overload;virtual;
 constructor Create(haveBone:Boolean);overload;virtual;
end;

THuman=class(TLiveThing)
public
 constructor Create(whereLive:string);overload;override;
 constructor Create(age:integer);overload;
end;

理论上,如果我实例化 THuman,我有 2 个构造函数,但实际上代码洞察显示我有 5 个构造函数,实际上我想看到 3 个构造函数, - 创建(whereLive:String),覆盖 - 创建(年龄:整数) - 创建(有骨:整数)

human:=THuman.Create(       <=====in there I have 5 suggestion constructor

为什么我有这种奇怪的行为?如何解决它,因为它太烦人了,我不能总是检查我需要实例化的类,如果我像下面这样实例化

human:=THuman.Create(); <===== it doesnt give me error

我如何完全隐藏我的anchestor 构造函数? ,因为如果我像上面那样实例化,完全给我一个错误的对象

更新:我也可以看到默认的 Create without parameter from TObject

【问题讨论】:

  • 你有太多的虚拟构造函数。你只需要其中一个。
  • 您确定需要任何虚拟构造函数吗?您是否曾经在编译时不知道类型的情况下实际实例化这些类中的任何一个?如果没有,那么你不需要虚拟构造函数。
  • 这里很难给你建议,因为我们不知道是什么驱使你拥有这么多的重载和虚拟构造函数。从表面上看,你的整个设计都很有味道。我的直觉是修复设计将解决问题。试图隐藏构造函数类似于将衣夹放在鼻子上。设计仍然很臭,你再也闻不到了。
  • ok,我更新了我的问题以明确我的观点,因为实际上在我的代码中,两个构造函数都有完全不同的参数,有时我需要从基类重写两个构造函数,有时我只使用构造函数从基类。当然我可以将另一个构造函数重命名为 CreateByWhereLive 或其他不同的东西来解决这个问题,我可以让它正常工作,但是如果我使用“创建”,我不明白为什么它会有这样的行为......
  • 我需要所有的重载和虚拟构造函数。我不同意。您不应拥有多个虚拟构造函数。如果你这样做了,你的设计是错误的。

标签: delphi methods overriding virtual overloading


【解决方案1】:

不把重点放在你糟糕的构造函数实现上,

您的问题是祖先类和子类都定义在同一个单元中,因此私有/受保护的标准定义在这里不适用。

如果您想在实例化派生类的对象时阻止祖先构造函数(您在子类中重写)显示为代码参数,那么只需使其成为 strict 受保护或 strict 私有部分。

用你的例子:

TLiveThing=class
strict protected
 constructor Create(whereLive:string); virtual;
end;

THuman=class(TLiveThing)
public
 constructor Create(whereLive:string); overload; override;
 constructor Create(age:integer); overload;
end;

这将防止祖先构造函数Create(whereLive:string) 在您创建子类的实例时显示为参数。

正如 David 所指出的,这与隐藏默认的 Create 构造函数无关,它仅适用于隐藏您的自定义构造函数。

【讨论】:

  • 那根本没有帮助。通过引入重载的Create,可以看到无参数的TObject.Create。查看副本。
  • 是的,但他还说他想隐藏祖先构造函数 Create(whereLive:string),这至少可以帮助他隐藏它。
  • 所以,这意味着,在delphi中,如果我在基类上有2个虚拟构造函数,那么派生类有1个构造函数和1个从基类覆盖,那么当我从派生类实例化对象时,我可以有4个构造函数,包括被覆盖的构造函数(我从我的代码中获得了我的问题的经验)那是错误还是类似的? (因为我在 c# 上没有任何类似的行为)
  • 因为,实际上我不想隐藏一些严格私有的构造函数,我只是想要那个构造函数被派生类覆盖,所以如果我实例化对象,我可以看到被覆盖的构造函数只是派生对象的构造函数,我在 delphi 方面的经验,代码洞察力为我提供了来自基类的建议构造函数和来自派生类的构造函数,尽管我已经覆盖了该构造函数
  • @navirius ,严格的词对方法的 override 指令没有影响,结果是一样的。我认为您对我的答案中隐藏的词感到困惑。您决定在派生类中覆盖的祖先虚拟构造函数仍将被覆盖,严格这个词只是意味着如果父类和子类都定义在同一个单元中,它将省略您在实例化时遇到的困惑目的。您可以通过在 Unit1 中编写 Ancestor 类和在 Unit2 中编写 Child 类来获得相同的结果。我会更新答案,希望你接受。
猜你喜欢
  • 2013-01-15
  • 2012-02-19
  • 1970-01-01
  • 2012-11-28
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多