2016-08-20 18 views
0

クラスを継承リストの最後に指定すると、常にクラスを密封として指定する必要がありますか?例として、私はFoundationBuilding、およびHouseという3つのクラスを持っているとします。継承と密封

public class Foundation 
{ 
    // Base class 
} 

public class Building : Foundation 
{ 
    // Derived from Foundation 
} 

public sealed class House : Building 
{ 
    // Last in the inheritance tree 
} 

私は家自体がBuildingから継承されている間、誰もが家を継承したくないと言うとき、それは、安全性についてですか?

+0

はい、消費者が継承しないようにするには、制限するために 'sealed'とマークすることができます。 – Rahul

+0

継承可能なクラスに関する影響を考えてください。ドキュメンテーション、拡張ポイント、変更可能なクラスのデザイン... –

+0

"なぜ誰かがクラスを封印するのですか?"または「クラスを封印することは何をしますか?」最初は純粋に意見があり、2番目は間違いなく答えることができます。 –

答えて

0

GetDivisorメソッドを持つMyDivisorクラスを持っているとしましょう。次のようにSetDivisor方法が実装されます。

public void SetDivisor(int divisor) 
{ 
    if (divisor != 0) 
    { 
     _divisor = divisor; // `_divisor` is a field of the class 
    } 
} 

あなたがゼロであること除数の方法がないと思うかもしれないにもかかわらず、誰かがあなたのMyDivisorクラスを継承し、仮想ではない、あなたの方法を(非表示にするnewキーワードを使用する場合があります)。

new public void SetDivisor(int divisor) 
{ 
    _divisor = divisor; 
} 

今すぐ誰かが書くことができます:あなたは、あなたのクラスを封印した場合

var divisor = new MyEvilDivisor(); 
divisor.SetDivisor(0); 
int i = 5/(divisor.GetDivisor()); 

、があるだろう、それを継承し、SetDivisorの動作を変更する方法はありません派生MyEvilDivisorクラスはSetDivisorの次の実装を持っていますMyEvilDivisorを使用したときに確実に起こる、アプリケーションの予期しないランタイムエラーにつながることはありません。これは安全性を考えている例だと思います。

2

クラスが継承されるように設計されている場合を除き、私が読んだもの(2010年からのものですが、本の名前は覚えていません)から、他の開発者が継承しないようにいくつかの方法が仮想ではないため、ロードブロッキングに陥ってしまいます。

0

Should I always specify a class as sealed if it's the last in the inheritance list?

この質問には具体的な答えはありません。あなたが言及したようないくつかのシナリオがあるかもしれません。誰もがHouseクラスから継承しないようにします。この特定のシナリオでは、Houseクラスを封印する必要があります。あなたが従うことができる知識をさらに進めるためにthis

ソフトウェアを開発するときには、他にもいくつかのケースがあります。あなたはあなたの現在の機能に固執しているのか、あるいはその期間にわたって変更することができますか?それから、あなたは違った考えをするべきです。さらなる学習のためにあなたに従うことができますthis