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 がない)

親クラス型の変数に子クラスのインスタンスを代入できます。これをアップキャストと呼びます。

継承を使う場面

継承が適切なのは、共通の性質を持つクラス群をまとめたいときです。

共通の機能を親クラスに定義

子クラスで固有の機能を追加

コードの重複を削減

ただし、継承は強い結合を生むため、安易に使うと保守が難しくなります。「継承より委譲」という設計原則も覚えておくとよいでしょう。