C#-4

前回までに「制御構造」と「コレクション」を習得しましたので、今回はC#の強力な機能である「継承(Inheritance)とポリモーフィズム(Polymorphism)」というオブジェクト指向の柱と、「インターフェース」について解説します。


9. 継承(Inheritance)

継承とは、あるクラス(親クラスまたは基底クラス)が持つプロパティメソッドを、別のクラス(子クラスまたは派生クラス)が引き継いで利用できる仕組みです。これにより、コードの再利用性が高まります。

📄 継承の書き方

クラス名の後にコロン : を使い、継承元となる親クラス名を記述します。

C#

// 1. 親クラス(基底クラス)
public class Animal
{
    public int Age { get; set; }

    public void Eat()
    {
        System.Console.WriteLine("動物は食事をします。");
    }
}

// 2. 子クラス(派生クラス): Animalクラスを継承
public class Dog : Animal
{
    public string Breed { get; set; } // Dog独自のプロパティ

    public void Bark() // Dog独自のメソッド
    {
        System.Console.WriteLine("ワンワンと吠えます。");
    }
}

// 実行例
Dog myDog = new Dog();
myDog.Age = 5;      // Animalクラスから継承したプロパティ
myDog.Eat();        // Animalクラスから継承したメソッド
myDog.Bark();       // Dogクラス独自のメソッド

10. ポリモーフィズム(Polymorphism:多態性)

ポリモーフィズムとは、「同じ名前のメソッドでも、オブジェクトの種類によって異なる動作をする」仕組みです。これにより、コードの柔軟性が大きく向上します。

ポリモーフィズムを実現するために、「オーバーライド」を使用します。

🔄 オーバーライドの実現

親クラスのメソッドを子クラスで上書き(再定義)するには、親クラスのメソッドに virtual、子クラスのメソッドに override キーワードを付けます。

C#

public class Animal
{
    // 1. 親クラスのメソッドに virtual を付ける(上書きを許可)
    public virtual void MakeSound()
    {
        System.Console.WriteLine("(一般的な動物の鳴き声)");
    }
}

public class Cat : Animal
{
    // 2. 子クラスのメソッドに override を付ける(親のメソッドを上書き)
    public override void MakeSound()
    {
        System.Console.WriteLine("ニャーニャー"); // 独自の動作に再定義
    }
}

// 実行例
Animal genericAnimal = new Animal();
Cat myCat = new Cat();

genericAnimal.MakeSound(); // 出力: (一般的な動物の鳴き声)
myCat.MakeSound();         // 出力: ニャーニャー

11. インターフェース(Interface)

インターフェースは、「クラスが実装すべき機能の約束事(設計契約)」を定義するための型です。

インターフェース自体はメソッドやプロパティの**定義(宣言)**しか持たず、具体的な処理(実装)は持ちません。そのインターフェースを実装するクラスが、その処理を必ず提供する(義務付けられる)ことになります。

🔗 インターフェースの定義と実装

インターフェース名には慣習として頭に大文字の I を付けます(例: IMovable)。

C#

// 1. インターフェースの定義(機能の約束)
public interface IMovable
{
    // メソッドの定義(実装を持たない)
    void Move(int distance);
    
    // プロパティの定義
    int CurrentPosition { get; }
}

// 2. クラスがインターフェースを実装する
public class Truck : IMovable
{
    private int _position = 0;

    // インターフェースで定義されたメソッドを必ず実装する
    public void Move(int distance)
    {
        _position += distance;
        System.Console.WriteLine($"トラックが {distance} 移動しました。");
    }

    // インターフェースで定義されたプロパティを実装する
    public int CurrentPosition
    {
        get { return _position; }
    }
}

// 実行例
Truck myTruck = new Truck();
myTruck.Move(50);
System.Console.WriteLine($"現在の位置: {myTruck.CurrentPosition}"); // 出力: 50

💡 インターフェースを使うメリット

  • 機能の保証: インターフェースを実装したクラスは、そのインターフェースが定めるすべてのメソッドを必ず実装しなければならないため、特定の機能が提供されることを保証できます。
  • 疎結合: 実際のクラス型ではなく、インターフェース型で変数を扱うことで、具体的な実装に依存しない柔軟なコードを書けるようになります。C#IMovable vehicle = new Truck(); // トラック以外のIMovableを実装したクラスに簡単に切り替えられる vehicle.Move(10);

継承、ポリモーフィズム、インターフェースは、C#やその他のオブジェクト指向言語で複雑なシステムを設計・構築するための土台となる考え方です。