10

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

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

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

这在 2010 年也是如此:C#:继承构造函数

这仍然是真的吗?

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

4

4 回答 4

14

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

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

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

于 2013-02-08T09:52:07.037 回答
5

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

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

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

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

于 2013-02-08T09:52:17.030 回答
1

C# 中不继承构造函数。

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

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

于 2013-02-08T09:58:20.510 回答
1

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

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

查看 :Constructors (C# Programming Guide)

从规范§1.6.7.1:

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

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

于 2013-02-08T09:53:39.863 回答