ここでは、C# の sealed 修飾子について紹介しています。class 宣言につければそのクラスを継承するることができなくなり、virtual メソッドをオーバーライドしたメソッドにつると、それ以降継承したクラスではその仮想メソッドをオーバーライドすることができなくなります。
スポンサーリンク
sealed 修飾子でクラスの継承を禁止
まずは、クラスの宣言に sealed 修飾子をつけたときについてみて見ます。以下のように、sealed 就職子がついたクラス HaseiNG クラスを Hasei クラスで継承しようとしてもコンパイルエラーとなります。
public sealed class HaseiNg { } public class Hasei : HaseiNg { }
絶対に継承しない場合は、sealed 修飾子をつけておくと、最適化によって多少パフォーマンスによい影響を与えるかもしれないとのことです。もちろん、設計レベルで継承NGとしているのであれば継承禁止であることを明示的にするためにも sealed 宣言しておいたほうが良いでしょう。
仮想メソッドの override の実装に sealed 修飾子
次に、もう一つの sealed 修飾子についての使用例です。classX に定義したオーバーライド可能な仮想メソッド test を、classX を継承した classY でオーバーライドしています。そして、そのメソッドに sealed 修飾子をつけています。そうすることによって、さらに classY を継承した classZ では、test メソッドをオーバーライドできなくなり、オーバーライドしようとしてもコンパイルエラーが発生します。
public class classX { // 仮想メソッド test を定義 protected virtual int test() { return 1; } } // classXを継承し、testメソッドをオーバーライド public class classY : classX { protected sealed override int test() { return 2; } } // classYを継承しても 既に sealed つきでオーバーライドされた test メソッドは // classZ ではオーバーライドできない(コンパイルエラー) public class classZ : classY { protected sealed override int test() { return 3; } }
オーバーライド使用してもコンパイルエラーとなります。