我是否需要为抽象类提供一个空的受保护构造函数?

Mou*_*Lin 1 .net c# abstract-class design-guidelines

我知道抽象类中的构造函数应该用C#保护.

但是一些抽象类不需要非参数构造函数.例如:

public abstract MyAbstractClass {
    public abstract Method1();
    public abstract Method2();
    // non-parameterless constructors are not needed
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在上面的类中,我是否需要提供一个空的受保护构造函数来覆盖默认的隐式构造函数?那是:

public abstract MyAbstractClass {
    protected MyAbstractClass() { }

    public abstract Method1();
    public abstract Method2();
}
Run Code Online (Sandbox Code Playgroud)

如果我不提供这个空的受保护构造函数,那么会有一个隐式的默认构造函数,它是公共的(正确吗?).这打破了"抽象类中的构造函数不应该公开"的规则.

但是当我检查ASP.NET MVC框架的源代码时,我发现它们没有为抽象类提供空的受保护构造函数.所以,也许设计规则应该是:

如果在抽象类中定义构造函数,则它们不应该是公共的.

如果在抽象类中不需要非参数构造函数,则不要定义它们.

有什么想法吗?

Dan*_*Dan 6

不,您不需要声明受保护的默认构造函数.如果您在抽象类的构造函数中没有任何操作,请不要声明一个.如果你确实有事要做,那么将其标记为受保护将与将其标记为公共相同,因为基本构造函数只能由子进程调用,并且子进程无论如何都会受到保护访问.