如何防止类被继承 不使用密封关键字?
提前致谢。
答案 0 :(得分:10)
在你班级的构造函数中:
public MyUnsealedClass()
{
if (this.GetType() != typeof(MyUnsealedClass))
throw new Exception("Don't do that");
}
为什么不使用sealed
关键字?
答案 1 :(得分:9)
另一种方法是,您可以创建一个返回类型对象的静态方法,然后将构造函数设为私有。这样做的好处是它会产生编译时错误,而不是运行时错误。
答案 2 :(得分:4)
您可以使用私有构造函数
class Base
{
private Base() {}
}
class Derived : Base
{
// derp
}
然后为creaet Base对象提供一个实用程序(比如Base上可以访问私有ctor的静态方法
class Base
{
private Base() {}
public static Base CreateBase() { return new Base(); }
}
此外,如果您希望能够从这个课程派生,但是您不希望其他人这样做,您可以让您的课程内部(甚至是内部的ctor)
class Base
{
internal Base() { }
}
class Derived : Base
{
}
// in another assembly
class MyOwnDerived : Base
{
// derp
}
答案 3 :(得分:1)
你可以通过使用私有构造函数来实现这一点:
public class NonInheritableClass
{
static NonInheritableClass GetObject()
{
return new NonInheritableClass();
}
private NonInheritableClass()
{
}
}
答案 4 :(得分:0)
在构造函数中抛出异常将起作用。
我同意 - 为什么不使用密封?就是出于这个原因。
除非您正在尝试做其他事情,如果是这种情况,也可能有更好的解决方案。