ホームに戻る
関連 :
目次 :
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 修飾した場合と同様)。