【问题标题】:Do C# classes inherit constructors?C# 类是否继承构造函数?
【发布时间】:2013-01-24 01:19:17
【问题描述】:

我刚看了http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/

不知道什么时候写的。它说:

“由于 C# 很遗憾没有继承基类的构造函数,所以这种新类型只有标准的没有参数的构造函数,因此相对没用。”

这在 2010 年也是如此:C#: inheriting constructors

这仍然是真的吗?

编辑:根据答案,我确信有办法绕过默认的无参数构造函数。没有构造函数继承还有其他原因吗?

【问题讨论】:

标签: c#


【解决方案1】:

在 C# 语言的整个生命周期中,构造函数从未被继承。这在 C# 5.0 中没有改变:在 C# 5.0 规范第 1.6.7.1 节的末尾,它仍然说:

与其他成员不同,实例构造函数不是继承的,并且一个类除了在类中实际声明的实例构造函数之外没有实例构造函数。如果没有为类提供实例构造函数,则会自动提供一个没有参数的空实例构造函数。

所以今天仍然如此,我想在可预见的未来也会如此。

【讨论】:

  • 也许提到您可以显式访问基类中的构造函数,因为这是许多人都在寻找的解决方案。
【解决方案2】:

你必须显式调用基类的构造函数,除非基类定义了默认构造函数。所以是的,它们不是遗传的。

这有时会导致一堆样板代码,您只需将参数从一个构造函数传递到另一个构造函数即可

public class NegativArgument : Exception {
     public NegativeArgument() : this("The number given was less than zero"){}
     public NegativeArgument(string message) : this(message,null){}
     public NegativeArgument(string message, Exception inner) : base:(message,inner){}
}

但是,如果您有一个应该始终具有相同消息的异常类型怎么办?如果构造函数被继承,你将如何解决这个问题?异常类有一个接受消息的构造函数,因此在这种情况下创建一个新的异常类型也会得到该构造函数,不继承构造函数会很容易

public class NegativArgument : Exception {
     public NegativeArgument() : base("The number given was less than zero"){}
}

如果基类没有默认构造函数,如果没有显式调用基类构造函数,则会出现编译错误。

【讨论】:

  • 我认为 Delphi 通过拥有大量受保护成员的类来解决后一个问题;这些类不应该被实例化。后代可以提高成员的知名度以供使用。
  • @cja 就像您可以从基类中公开构造函数一样。语法在第一个示例中:)
  • 我正在创建一个自定义异常,发现自己重新定义了派生类的构造函数。谷歌把我带到了这里。我想我别无选择,只能重新定义。 :)
【解决方案3】:

构造函数在 C# 中不被继承。

如果是,那么每个类都会有一个默认的无参数构造函数(因为所有类都派生自 Object 而 Object 有一个默认的无参数构造函数)。

许多类只能用特定的值来构造;如果每个类都有一个默认的无参数构造函数,这将是不可能的。

【讨论】:

  • 我敢肯定会有办法绕过默认的无参数构造函数。没有构造函数继承还有其他原因吗?
  • 没有什么好办法。
  • 是的 - 您将其设为私有。但它不适用于课堂以外的任何人。
  • 那么为什么@boltclock 粘贴的摘录说得完全相反呢? If no instance constructor is supplied for a class, then an empty one with no parameters is automatically provided.
  • @BrianVPS 提供默认构造函数与继承构造函数不同。
【解决方案4】:

您应该显式地将它们称为基类的构造函数。它们不是可继承的

对他们没有任何改变。

查看:Constructors (C# Programming Guide)

来自规范§1.6.7.1:

与其他成员不同,实例构造函数不是继承的,并且 除了实际声明的类之外,类没有实例构造函数 在课堂里。如果没有为类提供实例构造函数,则 自动提供一个没有参数的空。

http://msdn.microsoft.com/en-us/library/ms228593.aspx

【讨论】:

    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2012-09-03
    相关资源
    最近更新 更多