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修飾子は継承階層の中で「オーバーライドの連鎖をここで止める」ための有効な手段です。ライブラリやフレームワークを設計する際には、変更されたくないメソッドに積極的に活用しましょう。
-
C#のクラスにおけるメンバー関数とは?定義方法と使い方を実例で解説
メンバー関数とはクラスのメンバー関数(メソッド)とは、クラス定義の中でその定義やプロトタイプ(宣言)が記述される関数のことです。変数と同様にクラス内に宣言され、そのクラスのオブジェクトに対して操作を行います。また、そのオブジェクトが持つすべてのメンバー(フィールドやプロパティなど)にアクセスすることができます。以下は、メンバー関数の定義例です。public void setLength(double len) { length = len; } public void setBreadth(double bre) { breadth = bre; }C#でのメンバー関数へのアク
-
Pythonの静的メソッド(@staticmethod)とは?仕組みと使い方を解説
Pythonのクラスには、インスタンスメソッド、クラスメソッド、静的メソッド(スタティックメソッド)という3種類のメソッドを定義できます。それぞれ役割や呼び出し方が異なり、適切に使い分けることでコードの可読性と保守性が向上します。3種類のメソッドの違いインスタンスメソッド: 第1引数に self を受け取り、オブジェクト(インスタンス)の状態にアクセス・変更できます。クラスメソッド: @classmethod デコレータを付け、第1引数に cls を受け取り、クラス自体の状態にアクセスできます。静的メソッド: @staticmethod デコレータを付け、self も cls も受け取りません