前回までに「制御構造」と「コレクション」を習得しましたので、今回は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#やその他のオブジェクト指向言語で複雑なシステムを設計・構築するための土台となる考え方です。