关于c#:如何在基类中声明构造函数,以便子类可以在不声明它们的情况下使用它们?

How to declare constructors in base classes so that sub-classes can use them without declaring them?

我希望子类使用其父类的构造函数。但似乎我总是需要在子类中再次定义它们,以便能够工作,如:

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

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


你没有做错什么。

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

根据规范第1.6.7.1条:

Unlike other members, instance constructors are not inherited, and a class has no instance constructors other than those actually declared in the class. If no instance constructor is supplied for a class, then an empty one with no parameters is automatically provided.


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

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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)
    { }
}

上述内容可简化为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)
    { }
}

它仍然允许您用任意数量的参数初始化BaseClassDerivedClass

1
2
3
var d1 = new DerivedClass();
var d2 = new DerivedClass(42);
var d3 = new DerivedClass(42, 43);


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


So I'm wondering if I'm not declaring the constructor properly in the
parent class, because this seems silly.

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