带构造函数的抽象类,强制继承类来调用它

apo*_*pse 6 c#

可能重复,我有构造函数XYZ(字符串名称)的抽象类.我也有从该抽象类继承的类.如何强制继承类调用base(字符串名称)?现在我可以使用new Inherited(),它不会调用base construcotr.我想强制用户在继承的类中实现默认构造函数.

Mat*_*zer 13

没有显式构造函数的类具有无参数构造函数.另一方面,如果使用参数实现构造函数而没有无参数构造函数,则没有参数,您的类将无法实例化.

换一种说法:

public abstract class A 
{
    public A(string x) 
    {
    }
}

public class B : A 
{
    // If you don't add ": base(x)" 
    // your code won't compile, because A has a 
    // constructor with parameters!
    public B(string x) : base(x)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,如果A有一个无参数构造函数(或没有显式构造函数),B将自动调用基础构造函数.您不需要在此处编写任何其他内容.

否则,如果您的基类具有无参数构造函数和带参数的构造函数,则不能强制派生类自动调用除默认构造函数之外的构造函数(即所谓的无参数构造函数).

解决方法

嗯,这里没有特殊的解决方法,但要注意C#支持构造函数和方法中的可选参数.

如果你想100%确定派生类将调用一个具体的基础构造函数,你可以使用带有可选参数的单个无参数构造函数实现你的基类,并使用它而不是构造函数重载:

public class A
{
    public A(string x = "hello world") // or just string x = null
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果B派生的类A,B将始终调用A的基本构造函数,因为x它是可选的,并且它具有默认值.