'base' キーワード
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 20/70。
派生クラスが基底クラスから継承する場合、親のメンバーに直接アクセスする必要があることがよくあります。base キーワードはこの接続を提供し、基底クラスのコンストラクタを呼び出したり、そのメソッドやプロパティにアクセスしたりすることを可能にします。
base の最も一般的な用途は、親クラスのコンストラクタを呼び出すことです。派生オブジェクトを作成する際、値をベースクラスに渡すことができます。
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}: base(name) 構文は、Dog コンストラクタの本体が実行される前に Animal コンストラクタを呼び出します。これにより、基底クラスが最初に適切に初期化されることが保証されます。
また、派生クラス内から親メソッドを呼び出すために base を使用することもできます:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // AnimalのSpeakを呼び出します
Console.WriteLine("Woof!");
}
}ここでは、base.Speak() は親クラスのバージョンのメソッドを明示的に呼び出します。これは、親の振る舞いを完全に置き換えるのではなく、拡張したい場合に便利です。
チャレンジ
簡単派生クラスが base キーワードを使用して親クラスを適切に初期化し、継承された動作を拡張する方法を示す製品在庫システムを構築しましょう。
コードを整理するために、3つのファイルを作成します:
Product.cs:Inventory名前空間にProductクラスを定義します。このベースクラスは、Nameプロパティ (string) とPriceプロパティ (decimal) を持つ任意の製品を表します。両方の値を受け取るコンストラクタと、"{Name}: ${Price}"を返すGetInfo()メソッドを含めてください。ElectronicProduct.cs:Productを継承するElectronicProductクラスをInventory名前空間に定義します。このクラスにはWarrantyMonthsプロパティ (int) を追加します。コンストラクタは名前、価格、保証期間を受け取る必要があります。baseを使用して名前と価格を親コンストラクタに渡してください。親のGetInfo()をbaseを使って呼び出し、その後に" (Warranty: {WarrantyMonths} months)"を追加して出力を拡張するGetInfo()メソッドを作成します。Program.cs: メインファイルで、入力値を使用してElectronicProductを作成し、GetInfo()を呼び出してその完全な情報を表示します。
3つの入力を受け取ります:
- 製品名
- 価格
- 保証期間(月数)
作成した電子製品に対して GetInfo() を呼び出した結果を出力してください。
例えば、入力が Laptop、999.99、24 の場合、出力は以下のようになります:
Laptop: $999.99 (Warranty: 24 months)派生クラスがロジックを重複させるのではなく、ベースクラスの出力をどのように活用しているかに注目してください。base キーワードを使用すると、親の動作をシームレスに再利用し、拡張することができます!
チートシート
base キーワードを使用すると、派生クラスから親クラスのメンバーにアクセスできます。
親クラスのコンストラクタを呼び出すには、base を使用します:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}: base(name) 構文は、派生クラスのコンストラクタ本体が実行される前に親クラスのコンストラクタを呼び出し、適切な初期化を保証します。
派生クラスから親クラスのメソッドを呼び出すには、base を使用します:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Animal の Speak を呼び出す
Console.WriteLine("Woof!");
}
}これにより、親クラスの振る舞いを完全に置き換えるのではなく、拡張することができます。
自分で試してみよう
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// 入力を読み込む
string name = Console.ReadLine();
decimal price = Convert.ToDecimal(Console.ReadLine());
int warrantyMonths = Convert.ToInt32(Console.ReadLine());
// TODO: 入力値を使用して ElectronicProduct を作成する
// TODO: 作成した electronic product で GetInfo() を呼び出した結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。