3

我希望一个子类使用其父类的构造函数。但似乎我总是需要在子类中再次定义它们才能使其正常工作,如下所示:

public SubClass(int x, int y) : base (x, y) {
    //no code here
}

所以我想知道我是否没有在父类中正确声明构造函数,还是根本没有直接的构造函数继承?

4

4 回答 4

9

你没有做错任何事。

在 C# 中,实例构造函数不会被继承,因此在继承类型上声明它们并链接到基构造函数是正确的方法。

从规范§1.6.7.1:

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

于 2012-01-15T12:10:04.880 回答
4

我知道这并不能直接回答您的问题;但是,如果您的大多数构造函数只是在前一个构造函数上引入一个新参数,那么您可以利用可选参数(在 C# 4 中引入)来减少您需要定义的构造函数的数量。

例如:

public class BaseClass
{
    private int x;
    private int y;

    public BaseClass()
        : this(0, 0)
    { }

    public BaseClass(int x)
        : this(x, 0)
    { }

    public BaseClass(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

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

    public DerivedClass(int x)
        : base(x)
    { }

    public DerivedClass(int x, int y)
        : base(x, y)
    { }
}

以上可以简化为:

public class BaseClass
{
    private int x;
    private int y;

    public BaseClass(int x = 0, int y = 0)
    {
        this.x = x;
        this.y = y;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass(int x = 0, int y = 0)
        : base(x, y)
    { }
}

它仍然允许您使用任意数量的参数BaseClass进行初始化:DerivedClass

var d1 = new DerivedClass();
var d2 = new DerivedClass(42);
var d3 = new DerivedClass(42, 43);
于 2012-01-15T13:15:58.063 回答
3

构造函数不是从基类继承到派生的。每个构造函数都必须首先调用基类 ctor。编译器只知道如何调用无参数 ctor。如果基类中没有这样的ctor,则必须手动调用它。

于 2012-01-15T12:11:54.893 回答
1

所以我想知道我是否没有在父类中正确声明构造函数,因为这看起来很愚蠢。

如果基类没有默认构造函数,则必须在子类中重新声明它。这就是 OOP 在 .NET 中的工作方式。

于 2012-01-15T12:10:17.490 回答