ホームに戻る
関連 :
[C++]継承 (Inheritance) [C++]仮想関数 (Virtual Function) [C++]C++11
目次 :

C#における仮想メソッド・オーバーライドメソッドの定義

仮想メソッドの概念は [C++]仮想関数 を参照。
実体の無い「抽象メソッド」(Abstract Method : 純粋仮想関数と同義)を定義した場合、メソッドとそれを含むクラス(抽象クラス)の両方に abstract キーワードが必要となる。

実装例

// 基底クラスの定義 // (抽象(純粋仮想)メソッドを含むため abstract キーワードを付与 ⇒ 抽象クラス) public abstract class Base { // 仮想メソッドの定義 ⇒ virtual キーワードを付与 protected virtual void VirtualMethod01() { : } // 抽象メソッドの定義 ⇒ abstract キーワードを付与 protected abstract void AbstractMethod01(); } // Base を継承した派生クラスの定義 public class Derived : Base { // VirtualMethod01() のオーバーライド ⇒ override キーワードを付与 protected override void VirtualMethod01() { : } // AbstractMethod01() のオーバーライド ⇒ override キーワードを付与 protected override void AbstractMethod01() { : } }

C++との比較

C#C++
仮想メソッド
(仮想関数)
virtual キーワード付与
抽象メソッド
(純粋仮想関数)
abstract キーワード付与
実体無し
virtual キーワード付与
実体無し( = 0 )
オーバーライド時の
override キーワード付与
必須任意(※)
抽象クラスabstract キーワード付与-
※ : override キーワードはC++11以降で使用可能。非オーバーライド関数との区別のためには付与することが望ましい。

sealed 修飾

クラスを sealed 修飾すると、そのクラスは継承できなくなる。
(C++において、クラスを final 修飾した場合と同様。)
// 基底クラス(親)の定義 public class Base { // 仮想関数の定義 ⇒ virtual キーワードを付与 protected virtual void VirtualMethod01() { : } } // Base の派生クラス(子)の定義 // sealed 修飾あり ⇒ それ以降の継承を禁止 public sealed class Derived1 : Base { // VirtualMethod01() のオーバーライド protected override void VirtualMethod01() { : } } // Derived1 の派生クラス(孫)の定義 // ⇒ Derived1 が sealed 修飾されているためエラー // public class Derived2 : Derived1 // { // : // }
また、仮想メソッドや仮想プロパティを sealed 修飾した場合は、それらのオーバーライドが禁止される(C++において、関数を final 修飾した場合と同様)。