C#での仮想メソッドと抽象メソッドの調査

C#プログラミング言語は、仮想メソッドと抽象メソッドの両方をサポートします。それぞれに明確な利点があります。仮想メソッドを使用して遅延バインディングを実装しますが、抽象メソッドを使用すると、型のサブクラスにメソッドを明示的にオーバーライドさせることができます。この投稿では、仮想メソッドと抽象メソッドの両方、およびそれらをいつ使用する必要があるかについて説明します。

仮想メソッドは、基本クラスで仮想として宣言されているメソッドです。メソッドは、メソッドシグネチャでキーワード「virtual」を指定することにより、仮想として宣言されます。仮想メソッドには、戻り値の型がある場合とない場合があります。仮想メソッドを使用すると、そのタイプのサブクラスでメソッドをオーバーライドできます。これらは、ランタイムポリモーフィズムまたは遅延バインディングを実装するために使用されます。クラスの仮想メンバーまたは抽象メンバーをプライベートとして宣言できないことに注意してください。また、仮想メソッドに実装を含めることができます。つまり、仮想メソッドに実装を含めることができます。これらの実装は、仮想メソッドが定義されているタイプのサブクラスによってオーバーライドできます。

MSDNは次のように述べています。「virtualキーワードは、メソッド、プロパティ、インデクサー、またはイベント宣言を変更し、派生クラスでオーバーライドできるようにするために使用されます。」

ここで、仮想メソッドの使用方法をより明確にするために、いくつかのコードを掘り下げてみましょう。以下のコードスニペットを参照してください。

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

Test()メソッドは、Baseクラスで仮想として宣言され、Derivedクラスでオーバーライドされます。基本クラスでメソッドを仮想として宣言するためにvirtualキーワードがどのように使用されているかに注意してください。Derivedクラスの仮想メソッドをオーバーライドする場合、virtualキーワードは必要ありません。

次に、仮想メソッドがどのように呼び出されるかを示す、次に示すコードスニペットを参照してください。

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Baseクラスの2つのインスタンス(baseObj1とbaseObj2)が作成されることに注意してください。最初のケースでは、baseObj1という名前の参照オブジェクトがBaseクラスのインスタンスを参照しています。2番目のケースでは、baseObj2という名前の参照オブジェクトがDerivedクラスのインスタンスを参照しています。コードを実行すると、仮想メソッドを最初に呼び出すと、コンソールに「これは仮想メソッドの基本バージョンです」というメッセージが表示されます。2番目のケースでは、「これは仮想メソッドの派生バージョンです」というメッセージが表示されます。なぜこの違い?

最初のケースでは、参照オブジェクトbaseObj1のタイプが考慮されます。これはBaseタイプであるため、仮想メソッドのベースバージョンが呼び出されます。2番目のケースでは、参照オブジェクトbaseObj2のコンテキストが考慮され、結果が考慮されます。

抽象メソッドとは、基本クラスで抽象として宣言されており、実装を含めることができないメソッドです。つまり、機能を含めることはできません。抽象メソッドが定義されているタイプの派生クラスでメソッドを強制的にオーバーライドする場合は、抽象メソッドを使用できます。これは、コンパイル時にコンパイラーによって強制されます。したがって、基本クラスで抽象修飾子を使用してメソッドを抽象として宣言した場合、このクラスのサブクラスは抽象メソッドを実装する必要があり、コンパイラは派生クラスが抽象を実装していないことを示すエラーを表示します。メンバー。本質的に、抽象メソッドは、抽象基本クラスでabstractキーワードを使用して宣言され、このタイプの非抽象サブクラスには、抽象メソッドの独自の実装が必要です。抽象メソッドも本質的に暗黙的に仮想ですが、抽象メソッドを宣言するときにvirtualキーワードを使用することはできません。抽象メソッドは抽象クラス内でのみ宣言できることに注意してください。

抽象メソッドの一般的な使用法は、ToString()またはEquals()メソッドのオーバーライドを強制することです。次のコードスニペットは、EntityBaseという名前の抽象クラスで抽象メソッドがどのように宣言されるかを示しています。

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

EntityBaseクラスは、すべてのエンティティの基本型です。Customerエンティティクラスは、このクラスを拡張し、抽象メソッドの実装を提供します。本質的に、すべてのエンティティクラスは、ToString()メソッドとEquals()メソッドの独自の実装を提供します。これらのメソッドのデフォルトの実装は基本クラスに必要ないため、抽象としてマークされます。したがって、メソッドのオーバーライドは、EntityBaseという名前の基本クラスでメソッドを抽象として宣言することによって強制されます。