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

时间:2012-08-28 20:42:55

标签: c# generics parameters constructor derived-class

为什么这不可能? 在使用构造函数参数实例化“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<T>
{
    internal T Value;

    public BaseClass()
    {
    }

    public BaseClass(T value)
    {
        this.Value = value;
    }

    public void SomeMethod(T value)
    {
        this.Value = value;
    }
}

public class DerivedClass : BaseClass<String>
{
}

3 个答案:

答案 0 :(得分:5)

构造函数不是继承的 - 它就像那样简单。 DerivedClass包含一个构造函数 - 编译器默认提供的公共无参数构造函数,因为您尚未指定任何构造函数。

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

DerivedClass 提供构造函数很容易:

public class DerivedClass : BaseClass<String>
{
    public DerivedClass() : base()
    {
    }

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

答案 1 :(得分:0)

派生类需要公开构造函数

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

答案 2 :(得分:0)

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

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

,派生类型有一个:

derivedType(string foo) {...}

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

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