如何在不使用密封关键字的情况下防止类被继承?
提前致谢。
在你的类的构造函数中:
public MyUnsealedClass()
{
if (this.GetType() != typeof(MyUnsealedClass))
throw new Exception("Don't do that");
}
为什么不使用sealed
关键字呢?
另一种方法是您可以创建一个返回您类型的对象的静态方法,然后将构造函数设为私有。这样做的好处是它将创建编译时错误而不是运行时错误。
您可以使用私有构造函数
class Base
{
private Base() {}
}
class Derived : Base
{
// derp
}
然后提供一个实用程序来创建 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
}
您可以通过使用私有构造函数来实现这一点,类似于:
public class NonInheritableClass
{
static NonInheritableClass GetObject()
{
return new NonInheritableClass();
}
private NonInheritableClass()
{
}
}
在构造函数中抛出异常将起作用。
我同意 - 为什么不使用密封?就是因为这个原因。
除非您正在尝试做其他事情,如果是这种情况,可能还有更好的解决方案。