防止继承?

时间:2012-04-19 18:06:43

标签: c# c#-4.0 c#-3.0

如何防止类被继承            不使用密封关键字?

提前致谢。

5 个答案:

答案 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)

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

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

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