内容

仮想メソッドは実装本体を持つことができます。インスタンスメソッドの宣言に virtual 修飾子が含まれている場合、そのメソッドは仮想メソッドと呼ばれます。virtual 修飾子を使用した後は、static、abstract、または override 修飾子をさらに使用することはできません。

シンプルファクトリーパターンにおける仮想メソッドのコード:

//演算後の結果に使用する public virtual double GetResult() { double result = 0; return result; }

このクラスには GetResult() メソッドがあり、GetResult() メソッドには virtual 修飾子が付いています。この修飾子は、この基底クラスの派生クラスがこのメソッドをオーバーライドできることを示します。GetResult() メソッドの役割:出力ステートメント"これは仮想メソッドです!"をコンソールに出力する。

仮想メソッドの実装は派生クラスによって置き換えることができます。継承された仮想メソッドの実装を置き換えるプロセスは、そのメソッドをオーバーライドすると呼ばれます。仮想メソッドの呼び出しでは、その呼び出しに関係するインスタンスの実行時の型によって、実際に呼び出されるそのメソッドの実装が決定されます。

抽象メソッドと仮想メソッドの違い

  • 1. 仮想メソッドには実装部分が必要ですが、抽象メソッドには実装部分がありません。抽象メソッドは派生クラスにオーバーライドを強制するメソッドであり、そうしないと派生クラスはインスタンス化できません。
  • 2. 抽象メソッドは抽象クラス内でのみ宣言できますが、仮想メソッドはその限りではありません。クラスに抽象メソッドが含まれる場合、そのクラスも抽象であり、クラスを抽象として宣言する必要があります。
  • 3. 抽象メソッドは派生クラスでオーバーライドする必要があります。この点はインターフェースに似ています。仮想メソッドは派生クラスでオーバーライドする必要はありません。

簡単に言うと、抽象メソッドはサブクラスが実装する必要があります。仮想メソッドはすでに実装されており、サブクラスがオーバーライドすることも、オーバーライドしないこともでき、要件に応じて異なります。

抽象メソッドと仮想メソッドはどちらも派生クラスがオーバーライドできます。

まとめ

全体的に言えば、仮想メソッドとは宣言に virtual 修飾子が含まれているメソッドです。今のところはこのように理解しておくしかありません。将来、より深い理解が得られたら補足します。皆さんのご理解もぜひお聞かせください。