同じ命令で異なる動きができる「多態性(Polymorphism)」とは?
C#をはじめとしたオブジェクト指向言語では、多態性(Polymorphism) という概念が重要です。
多態性とは、同じ名前のメソッドを使っても、呼び出す対象に応じて異なる振る舞いをすることを意味します。
多態性の種類
- メソッドのオーバーロード: 引数の違いで複数定義
- メソッドのオーバーライド: 継承クラスで処理を上書き
- インターフェースや基底クラスを使った共通操作
例:親クラスと子クラスで同じメソッド名でも動作が違う
public class Animal {
public virtual void Speak() {
Console.WriteLine("何かの動物が鳴く");
}
}
public class Dog : Animal {
public override void Speak() {
Console.WriteLine("ワンワン!");
}
}
public class Cat : Animal {
public override void Speak() {
Console.WriteLine("ニャー!");
}
}
多態性を活かした使い方
Animal型の変数に、DogやCatなどのインスタンスを代入しても、それぞれのクラスに応じた動きになります。
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.Speak(); // → ワンワン!
a2.Speak(); // → ニャー!
なぜ多態性が便利なのか?
- 親クラス(またはインターフェース)でコードを共通化できる
- 実際の動作は子クラスに任せられる
- 処理を柔軟に拡張・変更しやすい
例:配列でまとめて処理
Animal[] animals = { new Dog(), new Cat(), new Dog() };
foreach (Animal a in animals) {
a.Speak(); // 実行時にそれぞれのSpeak()が呼ばれる
}
interfaceを使った多態性
public interface IShape {
void Draw();
}
public class Circle : IShape {
public void Draw() {
Console.WriteLine("○ を描く");
}
}
public class Square : IShape {
public void Draw() {
Console.WriteLine("□ を描く");
}
}
IShape shape = new Circle();
shape.Draw(); // → ○ を描く
まとめ
多態性(Polymorphism)とは、「同じ名前のメソッドでも、実行するオブジェクトによって処理が変わる」という性質です。
この仕組みにより、コードの共通化・拡張性・保守性が向上します。
C#での多態性は、virtual / override
やinterface
を通じて実現されます!