Sealed Keywordを使用せずにクラスが継承されないようにするにはどうすればよいですか?
前もって感謝します。
クラスのコンストラクターで:
public MyUnsealedClass()
{
if (this.GetType() != typeof(MyUnsealedClass))
throw new Exception("Don't do that");
}
sealed
しかし、キーワードを使用しないのはなぜですか?
もう 1 つの方法は、型のオブジェクトを返す静的メソッドを作成してから、コンストラクターを非公開にすることです。これには、実行時エラーではなくコンパイル時エラーが発生するという利点があります。
プライベートコンストラクターを使用できます
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
}
これは、次のようなプライベートコンストラクターを使用して実現できます。
public class NonInheritableClass
{
static NonInheritableClass GetObject()
{
return new NonInheritableClass();
}
private NonInheritableClass()
{
}
}
コンストラクターで例外をスローすると機能します。
私は同意しますが、シールを使用しないのはなぜですか? そのためにあるのです。
あなたが何か他のことをしようとしている場合を除き、その場合は、おそらくより良い解決策もあるでしょう.