1

Sealed Keywordを使用せずにクラスが継承されないようにするにはどうすればよいですか?

前もって感謝します。

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

もう 1 つの方法は、型のオブジェクトを返す静的メソッドを作成してから、コンストラクターを非公開にすることです。これには、実行時エラーではなくコンパイル時エラーが発生するという利点があります。

于 2012-04-19T18:09:34.393 に答える
4

プライベートコンストラクターを使用できます

class Base
{
  private Base() {}
}

class Derived : Base
{
  // derp
}

次に、Base オブジェクトを作成するためのユーティリティを提供します (プライベート ctor にアクセスできる Base の静的メソッドなど)。

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 に答える