この章のテーマ §
baseキーワードについて学びます。baseキーワードの機能は主に2つあります。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, クラスの基礎、継承の基礎、コンストラクタの基礎、thisキーワード
解説 §
baseキーワードの役割は2つあります。
一つは、基底クラスにアクセスする方法です。thisを使うと【このインスタンス】にアクセスできますが、thisの代わりにbaseを使うと、【このインスタンスを基底クラスとして使う】に機能が変化します。これで継承の際に上書きしてしまった場合でも、上書き前の機能を使用できます。
もう1つは、基底クラスのコンストラクタへのアクセスです。コンストラクタでthisの代わりにbaseを使うと、その引数の基底クラスのコンストラクタを呼び出すことができいます。引数が異なる基底クラスのコンストラクタを使いたい場合には便利です。
罠の数々 §
- 静的メソッド内から base キーワードを使うとエラーになる。base はthisの特殊なバリエーションなので【このインスタンス】というニュアンスを持つ。インスタンスと関係なく存在する静的なメンバーは対象にできない。その場合は、baseの代わりに基底クラス名を直接書けば良い
参考リンク §
base (C# リファレンス)
サンプルソース: kw_base §
var x = new MyClassB();
class MyClassA
{
public virtual void Sub() => Console.WriteLine("A.Sub called");
public MyClassA(string messasge) => Console.WriteLine($"MyClassA's constructor called: {messasge}");
}
class MyClassB : MyClassA
{
public override void Sub() => Console.WriteLine("B.Sub called");
public MyClassB() : base("from MyClassB")
{
Console.WriteLine("MyClassB's constructor called");
// 無指定のアクセス
Sub();
// thisアクセス
this.Sub();
// baseアクセス
base.Sub();
}
}
実行結果 §
MyClassA's constructor called: from MyClassB
MyClassB's constructor called
B.Sub called
B.Sub called
A.Sub called
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
var x = new C();
class A
{
public virtual void Sub() => Console.WriteLine("A");
}
class B : A
{
public override void Sub() => Console.WriteLine("B");
}
class C : B
{
public override void Sub() => Console.WriteLine("C");
}
class D : C
{
public override void Sub() => base.base.Sub();
}
- A
- B
- C
- コンパイルエラー
- 実行時例外
[[解答]]