2012-04-19 9 views
0

クラスが継承されないようにするには 封印済みキーワード?継承を防止しますか?

ありがとうございます。あなたのクラスのコンストラクタで

+7

を。あなたは 'sealed'キーワードに対して何を持っていますか? – Tim

+11

次のどのように ':'文字を使用せずにクラスから継承するのですか? :-) –

+3

?ペダルを使わずに車を運転するにはどうすればいいですか? – SLaks

答えて

10

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

なぜかかわらsealedキーワードを使用していませんか?

+3

非常に多くのupvotesはctorで例外をスローする....私は何かが欠けている必要があります – payo

+0

@スティーブ私は同意します。あなたのソリューションは間違いなく最高のようです。 – Joshua

+0

私は例外をスローすることに同意しますコンストラクタは非常に理想的ではない非常にタブーです。 –

9

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

4

あなたは次にあなたがしたい場合は、

class Base 
{ 
    private Base() {} 

    public static Base CreateBase() { return new Base(); } 
} 

また民間のctorへのアクセス権を持っているベースの静的メソッドのように(ベースオブジェクトをcreaetするユーティリティを提供プライベートコンストラクタ

class Base 
{ 
    private Base() {} 
} 

class Derived : Base 
{ 
    // derp 
} 

を使用することができますこのクラスから派生することができますが、他の人がそれをやりたがらないようにするには、クラスを内部(または内部の内部)にすることができます

class Base 
{ 
    internal Base() { } 
} 

class Derived : Base 
{ 
} 

// in another assembly 

class MyOwnDerived : Base 
{ 
    // derp 
} 
0

コンストラクターで例外をスローすると機能します。

私は同意します - なぜシールを使用しないのですか?それはその理由のためです。

あなたが何か他のことをやろうとしているのでなければ、そのような場合は、おそらくもっと良い解決策があります。

1

あなたは、線に沿って何かプライベートコンストラクタを使用することによって、これを達成することができます:私は、少なくとも簡単に、あなたができるとは思わない

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

    private NonInheritableClass() 
    { 
    } 
} 
関連する問題