仅具有私有构造函数的抽象类

Mic*_*nni 0 c# compiler-errors visual-studio

为什么要允许编译这段代码?

public abstract class AbstractPrivateBase
{
    private AbstractPrivateBase() { }
}
Run Code Online (Sandbox Code Playgroud)

继承者无法实例化自己.因此,没有办法从这个类派生出来.我觉得Visual Studio(甚至Resharper)应该显示一个错误,说明"抽象类不能只包含私有构造函数".因为在语言中允许这样做是没有意义的.

唯一可能的用法是此类包含静态成员.如果是这种情况,一个友好的警告说明"只有私有构造函数的抽象类可以变成静态的".因为没有办法访问任何其他成员而不是静态成员.

das*_*ght 6

如果您从该私有基础派生嵌套类,这将是完全合理的:

public abstract class AbstractPrivateBase {
    public static AbstractPrivateBase D1 = new Derived1();
    public static AbstractPrivateBase D2 = new Derived2();
    public static AbstractPrivateBase D3 = new Derived3();
    private AbstractPrivateBase() { }
    private class Derived1 : AbstractPrivateBase {
    }
    private class Derived2 : AbstractPrivateBase {
    }
    private class Derived3 : AbstractPrivateBase {
    }
}
Run Code Online (Sandbox Code Playgroud)

Derived1通过Derived3访问private AbstractPrivateBase()构造函数,因此这个技巧有效地限制了派生到嵌套类.

  • @Jonesopolis我不能想到这个特定实现的命名设计模式,但是当你需要非常严格地控制派生时,你可以使用这种方法.像这样的东西可以用来模拟Java在C#中的智能`enum`s. (2认同)