baseアクセス
隠ぺいされたメンバを呼び出す
派生クラス内で、基本クラスの隠ぺいされたメンバやオーバーライドされたメソッドを呼び出すには base キーワードを用いた base アクセス(base access)を用います。base アクセスは this アクセスと同じようにインスタンスメソッド、プロパティ、コンストラクタなどのブロック中でのみ利用でき、基本クラスのメンバへのアクセスを提供します。
base . 識別子
base [引数リスト]
base アクセスには 2 種類あり、基本クラスのメソッド、フィールド、プロパティなどのメンバにアクセスするには、メンバアクセス演算子と同じように . 記号に続いてアクセスする基本クラスのメンバの識別子を指定します。もう一方の角括弧 [ ] で括って引数リストを渡す構文は基本クラスのインデクサにアクセスします。
class A { public virtual void M() { System.Console.WriteLine("A.M()"); } } class B : A { public override void M() { System.Console.WriteLine("B.M()"); base.M(); } }
上記のように base アクセスを用いることで、オーバーライドしたメソッドがら基本クラスの仮想メソッドを呼び出すことができます。仮想メソッドは型に依存することなく、メソッドの実体がインスタンスに対して 1 つとなるため、B クラスのインスタンスから A クラスの M メソッドを呼び出すには、内部で base アクセスを用いる以外に方法はありません。
また、base アクセスは this アクセスと異なり、base キーワード自体は基本クラスのオブジェクトへの参照ではありません。必ず、上記の方法でメンバにアクセスする必要があり、例えば this キーワードのように base キーワードから参照を取得して変数に格納するといった処理はできません。
class PrettyCure { public virtual void Action() { System.Console.WriteLine("プリキュア!"); } } class HeartCatchPreCure : PrettyCure { public override void Action() { base.Action(); System.Console.WriteLine("オープンマイハート!"); } } class Test { public static void Main(string[] args) { PrettyCure precure = new HeartCatchPreCure(); precure.Action(); } }
コード1は PrettyCure クラスから派生する HeartCatchPreCure クラスでオーバーライドした Action() メソッドから、基本クラスのオーバーライドされた Action() メソッドを base アクセスを用いて呼び出します。Main() メソッド内では HeartCatchPreCure クラスのインスタンスを生成し、これの Action() メソッドを呼び出していますが、実行結果から確認できるように PrettyCure クラスの Aciton() メソッドが実行されています。