C#で学ぶポリモーフィズムの基本:PersonとStudentクラスを例に解説


以下は前書きの例です。


前書き

C#は、オブジェクト指向プログラミングを学ぶうえで非常に適した言語です。その中でも「ポリモーフィズム」は、オブジェクト指向の重要な概念の1つとして挙げられます。ポリモーフィズムを活用することで、コードの再利用性や拡張性が向上し、保守性の高い設計を実現できます。しかし、初心者にとっては少し抽象的な概念であり、実例を通じて学ぶことが理解の鍵となります。

この記事では、C#でポリモーフィズムをどのように活用できるかを、「Person」クラスを基底クラス、「Student」クラスを派生クラスとした具体的な例を使って解説します。このサンプルコードを読みながら、ポリモーフィズムの基礎とそのメリットを理解し、実際の開発に応用できる力を養いましょう。

サンプルコード

using System;

namespace PolymorphismExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 基底クラス型の変数に派生クラスのインスタンスを代入
            Person person = new Student();

            // 基底クラスで定義されたプロパティを設定
            person.Name = "太郎";
            person.Age = 20;

            // ポリモーフィズムを利用したメソッド呼び出し
            person.Walk();  // 派生クラスでオーバーライドされたメソッドが呼び出される

            // 型キャストで派生クラス固有の機能にアクセス
            if (person is Student student)
            {
                student.School = "〇〇小学校";
                student.Study();
            }
        }
    }

    /// <summary>
    /// 人を表す基底クラス
    /// </summary>
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        /// <summary>
        /// virtual修飾子を付けたメソッド (派生クラスで上書き可能)
        /// </summary>
        public virtual void Walk()
        {
            Console.WriteLine("人が歩いています...");
        }
    }

    /// <summary>
    /// 学生を表す派生クラス (Person クラスを継承)
    /// </summary>
    class Student : Person
    {
        public string School { get; set; }

        /// <summary>
        /// 基底クラスのWalkメソッドをオーバーライド
        /// </summary>
        public override void Walk()
        {
            Console.WriteLine("学生が急いで歩いています...");
        }

        /// <summary>
        /// 学生固有のメソッド
        /// </summary>
        public void Study()
        {
            Console.WriteLine("勉強しています...");
        }
    }
}

解説

1. ポリモーフィズムとは?

ポリモーフィズム(多態性)は、オブジェクト指向プログラミングの基本概念の1つであり、基底クラス型の変数を用いて異なる派生クラスの動作を共通化・統一する仕組みを指します。

  • 基底クラス型の変数に派生クラスのインスタンスを代入可能
  • 派生クラスでオーバーライドされたメソッドが呼び出される

2. virtual と override の使用

基底クラスのメソッドに virtual 修飾子を付けると、派生クラスで override キーワードを用いてそのメソッドを上書きできます。

基底クラス: Person

  • Walk(): virtual 修飾子を持つメソッド。派生クラスでオーバーライド可能。

派生クラス: Student

  • Walk(): 基底クラスの Walk()override キーワードで上書き。
    派生クラスのインスタンスが基底クラス型で扱われた場合でも、オーバーライドされたメソッドが呼ばれます。
public override void Walk()
{
    Console.WriteLine("学生が急いで歩いています...");
}

3. 実行例

基底クラス型変数の活用

Person person = new Student();

このコードにより、基底クラス型の変数 person に派生クラス Student のインスタンスを代入できます。

ポリモーフィズムによるメソッドの動作

person.Walk();  
// 出力: 学生が急いで歩いています...

派生クラスでオーバーライドされた Walk() が呼び出されます。

派生クラスの機能へのアクセス

基底クラス型変数から派生クラスのメンバーにアクセスするには、型キャストが必要です。

if (person is Student student)
{
    student.Study();
}
// 出力: 勉強しています...

ポリモーフィズムのメリット

  1. コードの汎用性
    • 基底クラス型の変数を使用して、異なる派生クラスのインスタンスを扱うことが可能です。
  2. 拡張性
    • 派生クラスで基底クラスのメソッドをオーバーライドすることで、動作を柔軟に拡張できます。
  3. 保守性
    • 基底クラス型を利用した統一的なインターフェース設計により、コードの修正が容易になります。

今後の発展

  1. 抽象クラスと抽象メソッド
    • 基底クラスで abstract 修飾子を用いると、派生クラスで必ずオーバーライドすることを強制できます。
public abstract class Person
{
    public abstract void Walk();
}
  1. インターフェースの活用
  • 複数の型に共通の契約を定義し、継承に依存しない設計が可能です。

まとめ

C#におけるポリモーフィズムを理解することで、コードの柔軟性や再利用性を向上させることができます。このサンプルでは Person クラスを基底クラスとし、Student クラスを派生クラスとして、ポリモーフィズムの基本を解説しました。
実際のプロジェクトでも、適切にポリモーフィズムを活用し、可読性や拡張性の高い設計を目指しましょう!