C# の継承の基本と書き方
継承はオブジェクト指向プログラミングの中核的な概念です。既存のクラス(親クラス)の機能を引き継いで、新しいクラス(子クラス)を作成できます。コードの再利用性が高まり、階層的な設計が可能になります。
継承の基本構文
C# では : を使って継承を表現します。
class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says woof!");
}
}Dog クラスは Animal クラスを継承しているので、Name プロパティと Eat メソッドをそのまま使えます。
var dog = new Dog();
dog.Name = "Pochi";
dog.Eat(); // Pochi is eating.
dog.Bark(); // Pochi says woof!継承で引き継がれるもの
親クラスから子クラスに引き継がれるメンバーは次のとおりです。
引き継がれるもの
public / protected のフィールド、プロパティ、メソッド。子クラスから直接アクセスできます。
引き継がれないもの
private メンバーは子クラスからアクセスできません。コンストラクタも自動では引き継がれず、明示的な呼び出しが必要です。
単一継承の制約
C# ではクラスの多重継承はできません。1 つのクラスが継承できる親クラスは 1 つだけです。
許可される
class Dog : Animal(単一継承)
許可されない
class Dog : Animal, Pet(多重継承)
複数の機能を持たせたい場合は、インターフェースを使います。インターフェースは複数実装できます。
継承の「is-a」関係
継承は「子クラス is a 親クラス」の関係を表します。Dog is an Animal(犬は動物である)という関係が成り立つときに継承を使います。
Animal animal = new Dog(); // Dog は Animal として扱える
animal.Eat(); // OK
// animal.Bark(); // コンパイルエラー(Animal には Bark がない)親クラス型の変数に子クラスのインスタンスを代入できます。これをアップキャストと呼びます。
継承を使う場面
継承が適切なのは、共通の性質を持つクラス群をまとめたいときです。
共通の機能を親クラスに定義
子クラスで固有の機能を追加
コードの重複を削減
ただし、継承は強い結合を生むため、安易に使うと保守が難しくなります。「継承より委譲」という設計原則も覚えておくとよいでしょう。