[ C# ] クラスの継承と virtual メソッドの override を禁止する ( Sealed )

Pocket

ここでは、C# の sealed 修飾子について紹介しています。class 宣言につければそのクラスを継承するることができなくなり、virtual メソッドをオーバーライドしたメソッドにつると、それ以降継承したクラスではその仮想メソッドをオーバーライドすることができなくなります。

スポンサーリンク

sealed 修飾子でクラスの継承を禁止

まずは、クラスの宣言に sealed 修飾子をつけたときについてみて見ます。以下のように、sealed 就職子がついたクラス HaseiNG クラスを Hasei クラスで継承しようとしてもコンパイルエラーとなります。

public sealed class HaseiNg { }
public class Hasei : HaseiNg { }
sealed 修飾子でクラスの継承を禁止する

sealed 修飾子でクラスの継承を禁止する

絶対に継承しない場合は、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; }
}

オーバーライド使用してもコンパイルエラーとなります。

sealed オーバーライドできません

sealed オーバーライドできません

参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *