c# - 我是否需要为抽象类提供一个空的 protected 构造函数?

标签 c# .net abstract-class design-guidelines

我知道抽象类中的构造函数在 C# 中应该受到保护。

但是有些抽象类不需要非无参构造函数。例如:

public abstract MyAbstractClass {
    public abstract Method1();
    public abstract Method2();
    // non-parameterless constructors are not needed
}

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

public abstract MyAbstractClass {
    protected MyAbstractClass() { }

    public abstract Method1();
    public abstract Method2();
}

如果我不提供这个空的 protected 构造函数,将会有一个隐式默认构造函数,它是公共(public)的(正确吗?)。这打破了“抽象类中的构造函数不应该公开”。

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

如果您在抽象类中定义构造函数,它们不应该是公共(public)的。

如果您不需要在抽象类中使用非无参数构造函数,那么就不要定义它们。

有什么想法吗?

最佳答案

不,您不需要声明 protected 默认构造函数。如果您在抽象类的构造函数中无事可做,请不要声明一个。如果您确实有事要做,将其标记为 protected 将与将其标记为公开相同,因为基类构造函数只能由子对象调用,而子对象无论如何都具有 protected 访问权限。

关于c# - 我是否需要为抽象类提供一个空的 protected 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838679/

相关文章:

c# - 有没有办法生成 WMI 代码/类?

c# - 跳过 xUnit 测试

c# - 从 C# Windows 窗体应用程序检索当前 URL

c# - 使用泛型但没有基类的工厂类

c# - 不同参数的过载 Action

c# - 更改 ASP.NET Core Razor 页面中的默认路由

.net - PropertyInfo.GetSetMethod(true)不从基类返回属性的方法

.net - 如何在 .NET 中为 SSL 连接设置测试证书?

typescript - 在 TypeScript 定义文件中声明父类(super class)

Java确保传递给方法的对象扩展了给定的类