C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のsealed(封印)修飾子とは?メソッドのオーバーライドを禁止する方法

sealed修飾子とは

C#において、メソッドにsealed修飾子を付けると、そのメソッドはそれ以上オーバーライドできなくなります。つまり、継承チェーンのさらに下位にあるクラスで、同じメソッドを上書きすることが禁止されます。

ただし、重要なポイントとして、sealedメソッドは必ず派生クラスに属していなければならず、かつoverrideキーワードによってオーバーライドされたメソッドである必要があります。基底クラスのメソッドに直接sealedを付けることはできないため、必ず「sealed override」という形式で使用します。

コード例

ここでは、ClassOneを基底クラスとし、ClassTwoとClassThreeをその派生クラスとして例を見てみましょう。

class ClassOne {
   public virtual void display() {
      Console.WriteLine("baseclass");
   }
}

class ClassTwo : ClassOne {
   public sealed override void display() {
      Console.WriteLine("ClassTwoderivedClass");
   }
}

class ClassThree : ClassTwo {
   public override void display() {
      Console.WriteLine("ClassThree: Another Derived Class");
   }
}

実行結果とエラーについて

上記のコードでは、ClassTwoのdisplay()メソッドにsealed overrideが指定されています。そのため、さらに下位の派生クラスであるClassThreeでdisplay()をオーバーライドしようとした時点で、コンパイルエラーが発生します。

エラーメッセージは次のような内容になります。

error CS0239: 'ClassThree.display()': 継承メンバー 'ClassTwo.display()' はシールされているため、オーバーライドできません。

sealed修飾子を使うメリット

sealed修飾子を活用すると、次のようなメリットがあります。

  • 意図の明確化: 「これ以上のオーバーライドは許可しない」という設計上の意図をコードで明示できます。
  • 安全性の向上: 派生クラスによる予期しない動作の変更を防ぎ、クラスの挙動を安定させられます。
  • パフォーマンス: コンパイラが仮想呼び出しを最適化しやすくなる場合があります。

このように、sealed修飾子は継承階層の中で「オーバーライドの連鎖をここで止める」ための有効な手段です。ライブラリやフレームワークを設計する際には、変更されたくないメソッドに積極的に活用しましょう。

  1. C#のクラスにおけるメンバー関数とは?定義方法と使い方を実例で解説

    メンバー関数とはクラスのメンバー関数(メソッド)とは、クラス定義の中でその定義やプロトタイプ(宣言)が記述される関数のことです。変数と同様にクラス内に宣言され、そのクラスのオブジェクトに対して操作を行います。また、そのオブジェクトが持つすべてのメンバー(フィールドやプロパティなど)にアクセスすることができます。以下は、メンバー関数の定義例です。public void setLength(double len) { length = len; } public void setBreadth(double bre) { breadth = bre; }C#でのメンバー関数へのアク

  2. Pythonの静的メソッド(@staticmethod)とは?仕組みと使い方を解説

    Pythonのクラスには、インスタンスメソッド、クラスメソッド、静的メソッド(スタティックメソッド)という3種類のメソッドを定義できます。それぞれ役割や呼び出し方が異なり、適切に使い分けることでコードの可読性と保守性が向上します。3種類のメソッドの違いインスタンスメソッド: 第1引数に self を受け取り、オブジェクト(インスタンス)の状態にアクセス・変更できます。クラスメソッド: @classmethod デコレータを付け、第1引数に cls を受け取り、クラス自体の状態にアクセスできます。静的メソッド: @staticmethod デコレータを付け、self も cls も受け取りません