継承の基本構文 (:)
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 19/70。
継承(Inheritance)により、あるクラスが別のクラスのプロパティやメソッドを引き継ぐことができます。同じコードを書き直す代わりに、共通の機能を備えた基底クラス(親)を作成し、それを継承する派生クラス(子)を作成します。
C#では、コロン : 記号を使用して継承を指定します:
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}DogクラスはAnimalからすべてを継承します。これらを再度宣言することなく、NameプロパティとEat()メソッドにアクセスできます。さらに、独自のBark()メソッドを追加しています:
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // 出力: Buddy は食事をしています。
myDog.Bark(); // 出力: Buddy は Woof! と吠えています。C#は単一継承のみをサポートしています。つまり、クラスは1つの基底クラスからのみ継承できるということです。しかし、派生クラスが別のクラスの基底クラスとなるような継承チェーンを構築することも可能です。これにより、コードの整理と再利用性を維持しながら、現実世界の概念をモデル化した階層構造を作成できます。
チャレンジ
簡単継承によって、派生クラスがベースクラスの機能を共有しながら、独自の動作を追加できることを示す車両の階層構造を構築しましょう。
コードを整理するために、3つのファイルを作成します:
Vehicle.cs:Transport名前空間にVehicleクラスを定義します。これはすべての車両が共有するベースクラスになります。このクラスには、Brandプロパティ (string) とYearプロパティ (int) を持たせ、"{Brand} engine started."と出力するStartEngine()メソッドを追加してください。Car.cs:Transport名前空間に、Vehicleを継承するCarクラスを定義します。この車には独自のプロパティNumberOfDoors(int) と、"{Brand} goes Beep Beep!"と出力するHonk()メソッドを追加します。Program.cs: メインファイルで、入力値を使用してCarインスタンスを作成します。プロパティ(継承されたものを含む)を設定し、その車が自身のメソッドとVehicleから継承したメソッドの両方を使用できることを示してください。
3つの入力を受け取ります:
- ブランド名
- 年式
- ドアの数
車の情報を表示し、その機能を次の形式で示してください:
Car: {Brand} ({Year})
Doors: {NumberOfDoors}
{StartEngine output}
{Honk output}例えば、入力が Toyota、2022、4 の場合、出力は次のようになります:
Car: Toyota (2022)
Doors: 4
Toyota engine started.
Toyota goes Beep Beep!Car が Vehicle で定義されている Brand プロパティや StartEngine() メソッドにアクセスできることに注目してください。これが継承の力です。派生クラスはベースクラスからすべてを自動的に取得します!
チートシート
継承を使用すると、コロン : 記号を使用して、あるクラスが別のクラスからプロパティやメソッドを引き継ぐことができます。
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}派生クラス (Dog) は、基底クラス (Animal) からすべてのプロパティとメソッドを継承し、独自のものを追加できます。
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // Inherited method
myDog.Bark(); // Own methodC# は単一継承のみをサポートしています。つまり、クラスは1つの基底クラスからのみ継承できます。ただし、継承チェーンを作成して階層を構築することは可能です。
自分で試してみよう
using System;
using Transport;
class Program
{
public static void Main(string[] args)
{
// 入力を読み込む
string brand = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
int doors = Convert.ToInt32(Console.ReadLine());
// TODO: Car インスタンスを作成する
// TODO: 車のプロパティ(Brand, Year, NumberOfDoors)を設定する
// TODO: 必要な形式で車の情報を出力する:
// Car: {Brand} ({Year})
// Doors: {NumberOfDoors}
// その後、StartEngine() と Honk() を呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。