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

C#でJavaのfinalキーワードを実現する方法:sealed修飾子の使い方

Javaにはクラスやメソッドの継承・オーバーライドを制限するためのfinalキーワードが用意されていますが、C#には同名のキーワードは存在しません。C#で同じ機能を実現したい場合は、sealed(シールド)キーワードを使用します。

sealed修飾子とは

sealed修飾子をメソッドに付けると、そのメソッドはそれ以上オーバーライドできなくなります。つまり、派生クラス側で挙動を上書きされることを防ぎたい場合に有効です。

ただし、メソッドにsealedを適用するには以下の条件を満たす必要があります。

  • sealedメソッドは派生クラスに属していること
  • 対象のメソッドがオーバーライドされたメソッド(override)であること

コード例

次の例では、派生クラスであるClassTwoのdisplay()メソッドにsealed修飾子が付いているため、さらに下位のクラスからこのメソッドをオーバーライドすることはできません。

ここでは、ClassOneが基底クラス、ClassTwoとClassThreeが派生クラスとなります。

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

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

class ClassThree : ClassTwo {
    public override void display() {   // コンパイルエラーになる
        Console.WriteLine("ClassThree: Another Derived Class");
    }
}

実行結果のポイント

このコードをコンパイルすると、ClassThree内のdisplay()メソッドに対して「sealed が指定されているためオーバーライドできない」というコンパイルエラーが発生します。これにより、ClassTwoで定義した実装がそれ以降の派生クラスによって変更されることを確実に防止できます。

なお、クラス自体の継承を完全に禁止したい場合は、クラス宣言にsealedを付けることで対応できます。メソッド単位での制御とクラス単位での制御、目的に応じて使い分けるとよいでしょう。

  1. Pythonのclassmethod(クラスメソッド)とは?使い方とコード例を解説

    Pythonのclassmethod(クラスメソッド)とは クラスメソッドは、第一引数としてクラス自身を受け取る特殊なメソッドです。この仕組みにより、クラスからインスタンス(オブジェクト)を生成しなくても、クラスに属するメソッドを直接呼び出すことができます。 使い方は非常にシンプルで、クラス内のメソッド宣言の直前にデコレータ @classmethod を付けるだけです。こうすることで、そのメソッドに直接アクセスできるようになります。 クラスメソッドの主な特徴は以下の通りです。 クラスメソッドはクラスに紐付けられており、利用するためにクラスのインスタンス化に依存しません。 クラスメソッドからク

  2. Pythonのクラスメソッドと静的メソッドの違いを徹底解説

    Pythonにおけるクラスメソッド(classmethod)は、クラスのインスタンスではなく、クラスそのものに紐づけられるメソッドです。静的メソッド(staticmethod)もこれと似ていますが、両者にはいくつかの重要な違いがあります。クラスメソッドには@classmethodデコレータを、静的メソッドには@staticmethodデコレータをそれぞれ付与して定義します。 クラスメソッドの構文 class my_class: @classmethod def function_name(cls, arguments): # 関数の処理内容