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

C#のvirtual・sealed・new・abstractキーワードの違いを徹底解説

はじめに

C#には、継承やポリモーフィズムに関わる重要なキーワードとして「virtual」「sealed」「new」「abstract」があります。それぞれ役割が大きく異なるため、正しく理解して使い分けることが、保守性の高いコードを書くための第一歩となります。この記事では、各キーワードの特徴と使い方をコード例とともに解説します。

virtual:メソッドのオーバーライドを許可する

virtual キーワードを付けたメソッドは、派生クラスでのオーバーライド(上書き)が可能になります。親クラスのメソッドを子クラスで再定義したい場合は、親クラス側のメソッドを virtual として宣言しておく必要があります。

public virtual void getResult() { }

sealed:継承やオーバーライドを禁止する

クラスに sealed を付けると、そのクラスは継承できなくなります。なお、抽象クラス(abstract class)は本質的に継承されることを前提としているため、sealed と abstract を同時に宣言することはできません。

また、メソッドに対して sealed を使用すると、それ以上のオーバーライドを防ぐことができます。この場合、sealed メソッドは必ず派生クラスのメンバーであり、かつ override されたメソッドでなければならない点に注意してください。

public sealed override void getResult() { }

new:基底クラスのメソッドを隠蔽する

new キーワードは、基底クラスのメソッドを派生クラス側で隠す(シャドウイング/Shadowing)ために使用します。派生クラス側の関数を new で宣言することで実現できます。override とは異なり、これは多態性による動作の置き換えではなく、単に基底クラスのメンバーを非表示にするものです。

public new string getResult()

abstract:実装を派生クラスに委ねる

抽象クラスには抽象メソッドが含まれ、その具体的な実装は派生クラスに委ねられます。abstract クラス自体は直接インスタンス化できないため、必ず継承して利用することになります。

abstract class Vehicle

まとめ:4つのキーワードの使い分け

キーワード主な役割
virtual派生クラスによるオーバーライドを許可する
sealedクラスの継承やメソッドのさらなるオーバーライドを禁止する
new基底クラスのメンバーを隠蔽する(シャドウイング)
abstract実装を持たないメンバーを定義し、派生クラスに実装を強制する

これらのキーワードを適切に組み合わせることで、柔軟かつ安全なオブジェクト指向設計を実現できます。用途に応じて正しく使い分けましょう。

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

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

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

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