1

如何在不使用密封关键字的情况下防止类被继承?

提前致谢。

4

5 回答 5

11

在你的类的构造函数中:

public MyUnsealedClass()
{
  if (this.GetType() != typeof(MyUnsealedClass))
      throw new Exception("Don't do that");
}

为什么不使用sealed关键字呢?

于 2012-04-19T18:07:59.943 回答
9

另一种方法是您可以创建一个返回您类型的对象的静态方法,然后将构造函数设为私有。这样做的好处是它将创建编译时错误而不是运行时错误。

于 2012-04-19T18:09:34.393 回答
4

您可以使用私有构造函数

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
}
于 2012-04-19T18:10:09.837 回答
1

您可以通过使用私有构造函数来实现这一点,类似于:

public class NonInheritableClass
{
    static NonInheritableClass GetObject()
    {
        return new NonInheritableClass();
    }

    private NonInheritableClass()
    { 
    }
}
于 2013-01-12T19:09:41.197 回答
0

在构造函数中抛出异常将起作用。

我同意 - 为什么不使用密封?就是因为这个原因。

除非您正在尝试做其他事情,如果是这种情况,可能还有更好的解决方案。

于 2012-04-19T18:10:16.073 回答