1

为什么这是不可能的?使用构造函数参数实例化“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>
{
}
4

3 回答 3

5

构造函数不是继承的——就这么简单。DerivedClass包含一个构造函数 - 编译器默认提供的公共无参数构造函数,因为您没有指定任何构造函数。

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

虽然很容易为以下内容提供构造函数DerivedClass

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

    public DerivedClass(string value) : base(value)
    {
    }
}
于 2012-08-28T20:45:41.963 回答
0

派生类需要暴露构造函数

public class DerivedClass : BaseClass<String>
{
    public DerivedClass(string str) :base(str) {}
}
于 2012-08-28T20:46:27.727 回答
0

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

父类型(int foo){...}
父类型(字符串 foo){...}

派生类型有一个:

派生类型(字符串 foo){...}

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

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

于 2012-09-26T16:07:28.250 回答