为什么我们不能在派生类中使用带参数的构造函数

为什么这不可能? 在使用constructor-parameter实例化“DerivedClass”时,我得到以下编译器错误:

‘GenericParameterizedConstructor.DerivedClass’不包含带有1个参数的构造函数

但调用一个非常相似的方法是有效的

为什么?

class Program { static void Main(string[] args) { // This one produces a compile error // DerivedClass cls = new DerivedClass("Some value"); // This one works; DerivedClass cls2 = new DerivedClass(); cls2.SomeMethod("Some value"); } } public class BaseClass { internal T Value; public BaseClass() { } public BaseClass(T value) { this.Value = value; } public void SomeMethod(T value) { this.Value = value; } } public class DerivedClass : BaseClass { } 

构造函数不是inheritance的 – 就这么简单。 DerivedClass包含一个构造函数 – 编译器默认提供的公共无参数构造函数,因为您尚未指定任何构造函数。

请注意,这与generics无关 。 如果BaseClass不是通用的,你会看到同样的事情。

但是,为DerivedClass 提供构造函数很容易:

 public class DerivedClass : BaseClass { public DerivedClass() : base() { } public DerivedClass(string value) : base(value) { } } 

派生类需要公开构造函数

 public class DerivedClass : BaseClass { public DerivedClass(string str) :base(str) {} } 

如果有一种方法可以指示编译器自动生成特定的派生类构造函数,这些构造函数可以精确地模仿并包装基类的所有部分,那么它有时会很有用。 但是,默认情况下会出现这种行为,这会有问题。 许多派生类都希望在创建类型的实例时调用它们的一些代码。 假设父类型有两个构造函数:

 parentType(int foo){...}
 parentType(string foo){...}

派生类型有一个:

 derivedType(string foo){...}

new derivedType(7);的效果应该是什么new derivedType(7); ? 编译器将知道如何创建new baseType(7); ,但是如果它创建了一个新的“空白”derivedType对象,然后简单地调用了父类型构造函数,那么结果将是一个从未运行过任何derivedType构造代码的derivedType对象。 虽然有些类没有任何问题(对于这样的类,前面提到的假设特性会有所帮助),很多类都会有。

顺便提一下,受保护的构造函数会出现一些与之相关的问题。 在某些.net语言中,至少包括当前版本的C#,如果非抽象类型Foo定义了受保护的构造函数,则该构造函数只能用于创建派生类型的实例。 在其他语言(包括当前的vb.net)中,派生类型中的代码可以调用基类型的受保护构造函数来创建新的基类型实例。