是否可以在 C# 中覆盖构造函数?

Posted

技术标签:

【中文标题】是否可以在 C# 中覆盖构造函数?【英文标题】:Is it possible to override a constructor in C#? 【发布时间】:2012-07-01 14:00:00 【问题描述】:

是否可以在派生类中重写基类的构造函数?

如果是这样,它是如何实现的?这在什么用例中是实用的?如果没有,为什么不呢?

【问题讨论】:

尊敬的专家编码来自逻辑,我只是​​在问resion 别人回答的很好。如果你不知道“chainig”构造函数的语法,就像这样:internal MyClass(string name) : base(null, 0, name) ... 。在此示例中,构造函数调用具有三个参数的基本构造函数。 重新开放选民:在重新投票之前请edit按照通常标准提出问题。 @JeffreyBosboom 已编辑。 【参考方案1】:

不,您不能覆盖构造函数。这个概念在 C# 中没有意义,因为构造函数根本不会被多态调用。你总是说明你要构造哪个类,以及构造函数的参数。

构造函数根本不被继承——但是派生类的所有构造函数都必须链接到同一类中的另一个构造函数,或者链接到基类中的一个构造函数。如果您不显式执行此操作,编译器会隐式链接到基类的无参数构造函数(如果该构造函数不存在或不可访问,则会发生错误)。

【讨论】:

“这个概念没有任何意义,真的——构造函数根本不会被多态地调用。” - 在德尔福,他们是。这是一个非常有用的功能,我找到了 C# 中所需的解决方法,要么使用反射并传递运行时检查的 Type 实例,要么提供单独的工厂类,相比之下相当麻烦。 @O.R.Mapper:是的,我是在 C# 的上下文中讨论的。其他语言做什么与这个答案无关。 在这种情况下,我建议答案不要声称“这个概念真的没有意义”,因为这听起来很笼统。像“这个概念很有意义,但在 C# 中无法使用这个概念,因为那里没有多态地调用构造函数。”可能会更清楚。 很公平——只要“我不能说它有多大用或没用”不会得出“它通常没有任何意义”的结论,我'我很高兴:) 为了完整起见,here、here 和 here 是各自 Delphi 功能的一些示例,只是为了为将来的访问者提供参考,因为我声称此功能存在.【参考方案2】:

不,你不能重写构造函数。

如果你看一下构造函数的基本语法,它应该与你编写它的类同名。

比方说,你写了一个与基类同名的方法(与基类构造函数相同),它只是派生类中的一个新方法,没有指定返回类型,这在语法上是错误的.

【讨论】:

【参考方案3】:

不,构造函数不是继承的。您不能在派生类中覆盖它们。原因

将始终调用基本构造函数,因为 从对象派生的每个类,因为每个类都必须有 至少一个调用 base() 构造函数的构造函数(明确地 或隐式)并且每次调用 this() 构造函数最终都必须 调用 base() 构造函数。

【讨论】:

以上是关于是否可以在 C# 中覆盖构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行

C#中子类构造函数中如何调用父类构造函数

使用此的 C# 构造函数 [重复]

dotnet C# 如果在构造函数抛出异常 析构函数是否会执行

dotnet C# 如果在构造函数抛出异常 是否可以拿到对象赋值的变量

为啥不在构造函数中调用可覆盖的方法?