C#类是否继承构造函数?

时间:2013-02-08 09:50:21

标签: c#

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

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

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

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

这仍然是真的吗?

编辑:继续回答之后,我确信有一种方法可以绕过默认的无参数构造函数。缺少构造函数继承还有其他原因吗?

4 个答案:

答案 0 :(得分:13)

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

  

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

所以它今天仍然适用,我想在可预见的未来它仍将如此。

答案 1 :(得分:4)

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

有时会导致一堆锅炉板代码,除了将参数从一个构造函数传递到另一个构造函数之外什么都不做

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){}
}

但是如果你有一个应该总是有相同消息的异常类型呢?如果构造函数是继承的,你会如何解决?异常类有一个接受消息的构造函数,因此在这种情况下创建一个新的Exception类型也会获得该构造函数,而不是继承构造函数使其变得容易

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

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

答案 2 :(得分:1)

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

没有改变任何关于他们的事情。

退房:Constructors (C# Programming Guide)

来自规范§1.6.7.1:

  

与其他成员不同,实例构造函数不是继承的,而是   class没有实际声明的实例构造函数   在课堂里。如果没有为类提供实例构造函数,那么   自动提供没有参数的空的。

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

答案 3 :(得分:1)

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

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

许多类只应使用特定值构建;如果每个类都有一个默认的无参数构造函数,那就不可能确保。