抽象 class 只有私有构造函数
Abstract class with only private constructors
为什么要允许编译这段代码?
public abstract class AbstractPrivateBase
{
private AbstractPrivateBase() { }
}
继承者不能实例化自己。因此,无法从这个 class 中推导出来。我觉得 Visual Studio(甚至 Resharper)应该显示一个错误,说明类似 "Abstract classes cannot contain only private constructors." 的内容,因为在语言中允许这样做是没有意义的。
唯一可能的用途是如果此 class 包含静态成员。如果是这种情况,一个友好的警告说明,"Abstract classes with only private constructors can be made static." 因为除了静态成员之外无法访问任何其他成员。
如果您从该私有基派生一个嵌套的 class,这将非常有意义:
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 {
}
}
类 Derived1
到 Derived3
可以访问 private AbstractPrivateBase()
构造函数,所以这个技巧有效地将派生限制为嵌套的 classes.
为什么要允许编译这段代码?
public abstract class AbstractPrivateBase
{
private AbstractPrivateBase() { }
}
继承者不能实例化自己。因此,无法从这个 class 中推导出来。我觉得 Visual Studio(甚至 Resharper)应该显示一个错误,说明类似 "Abstract classes cannot contain only private constructors." 的内容,因为在语言中允许这样做是没有意义的。
唯一可能的用途是如果此 class 包含静态成员。如果是这种情况,一个友好的警告说明,"Abstract classes with only private constructors can be made static." 因为除了静态成员之外无法访问任何其他成员。
如果您从该私有基派生一个嵌套的 class,这将非常有意义:
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 {
}
}
类 Derived1
到 Derived3
可以访问 private AbstractPrivateBase()
构造函数,所以这个技巧有效地将派生限制为嵌套的 classes.