
C#の継承とポリモーフィズム、使いこなせば設計の幅がグッと広がるぞ!
C#の継承とは?基本をわかりやすく解説
C#における継承は、既存のクラス(親クラスまたは基底クラス)の特性を新しいクラス(子クラスまたは派生クラス)が引き継ぐことができるオブジェクト指向プログラミングの重要な概念です。継承を使用することで、コードの再利用性が向上し、プログラムの構造をより整理することができます。
継承は、’is-a’の関係を表現するのに適しています。たとえば、「犬」クラスは「動物」クラスを継承することができます。なぜなら、犬は動物の一種だからです。
public class Animal
{
public string Name { get; set; }
public virtual void MakeSound()
{
Console.WriteLine("動物の鳴き声");
}
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("わんわん!");
}
}
継承のメリット・デメリット
継承には多くのメリットがありますが、デメリットも存在します。それらを理解した上で適切に利用することが重要です。
メリット:
・コードの再利用性:既存のクラスの機能を再利用できるため、開発時間を短縮できます。
・コードの保守性:共通の機能は親クラスで一元管理できるため、修正が容易になります。
・コードの拡張性:新しいクラスを簡単に追加できるため、機能拡張が容易になります。
デメリット:
・クラス間の結合度が高くなる:親クラスの変更が子クラスに影響を与える可能性があります。
・多重継承の複雑さ:C#ではクラスの多重継承はサポートされていません(インターフェースによる実装は可能です)。
C#のポリモーフィズム(多態性)とは?
ポリモーフィズム(多態性)とは、同じ名前のメソッドが異なるクラスで異なる動作をすることを指します。C#では、主に仮想メソッド(virtual method)とオーバーライド(override)を使って実現します。
基底クラスでvirtualキーワードを使って定義されたメソッドは、派生クラスでoverrideキーワードを使って再定義することができます。これにより、同じメソッド呼び出しでも、オブジェクトの型によって異なる動作をさせることが可能になります。
public class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("動物の鳴き声");
}
}
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("にゃー");
}
}
public class Program
{
public static void Main(string[] args)
{
Animal animal1 = new Animal();
Animal animal2 = new Cat();
animal1.MakeSound(); // 動物の鳴き声
animal2.MakeSound(); // にゃー
}
}
抽象クラスとインターフェース
ポリモーフィズムを実現するためのもう一つの方法として、抽象クラスとインターフェースがあります。
抽象クラスは、abstractキーワードを使って定義され、抽象メソッド(実装を持たないメソッド)を含むことができます。抽象クラスはインスタンス化できません。派生クラスは、抽象クラスのすべての抽象メソッドを実装する必要があります。
インターフェースは、interfaceキーワードを使って定義され、メソッドのシグネチャのみを定義します(実装は含みません)。クラスは複数のインターフェースを実装できます。
public abstract class Shape
{
public abstract double GetArea();
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
}
public interface IDrawable
{
void Draw();
}
参考リンク
まとめ
C#の継承とポリモーフィズムは、オブジェクト指向プログラミングの強力なツールです。継承によってコードの再利用性を高め、ポリモーフィズムによって柔軟なプログラム設計を実現できます。抽象クラスやインターフェースを理解することで、より高度なプログラミングが可能になります。これらの概念をマスターして、より効率的で保守性の高いコードを書けるようにしましょう。