C#で学ぶ継承の基本:PersonとStudentクラスを例に解説

2025年1月24日

C#は、オブジェクト指向プログラミングを学ぶうえで非常に適した言語です。その中でも「継承」は、オブジェクト指向の中核となる概念の1つです。継承を使うことで、コードの再利用性を高め、共通の機能を一元化して保守性の高いプログラムを作ることができます。また、派生クラスで独自のプロパティやメソッドを追加することで、特定の振る舞いを持つオブジェクトを簡単に拡張できます。

この記事では、C#における継承の基本を、「Person」クラスを基底クラス、「Student」クラスを派生クラスとした具体例を通じて解説します。共通のプロパティやメソッドを活用しながら、派生クラスでどのように新しい機能を追加できるかを理解しましょう。このシンプルなサンプルコードを通じて、継承の仕組みとそのメリットを実感し、今後のアプリケーション開発に役立ててください。


サンプルコード

using System;

namespace InheritanceExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // Studentクラスのインスタンスを生成
            Student student = new Student();

            // 基底クラス Person から継承した Name, Age プロパティを設定
            student.Name = "太郎";
            student.Age = 20;

            // Studentクラスで追加した School プロパティを設定
            student.School = "〇〇小学校";

            // Personクラスから継承したWalkメソッドの呼び出し
            student.Walk();

            // Studentクラス独自のStudyメソッドの呼び出し
            student.Study();
        }
    }

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

        /// <summary>
        /// 年齢
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 人が歩く動作を表すメソッド
        /// </summary>
        public void Walk()
        {
            Console.WriteLine("歩いています...");
        }
    }

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

        /// <summary>
        /// 学生が勉強する動作を表すメソッド
        /// </summary>
        public void Study()
        {
            Console.WriteLine("勉強しています...");
        }
    }
}

解説

1. 基底クラス: Person

  • Name (string)
    人物の名前を保持するプロパティです。
  • Age (int)
    人物の年齢を保持するプロパティです。
  • Walk() メソッド
    「歩く」動作を表現しています。実装例ではコンソールへ文字列を出力するだけですが、実際のアプリケーションでは移動処理やアニメーション制御に活用できます。

2. 派生クラス: Student

  • School (string)
    学生の通う学校名を保持するプロパティです。
  • Study() メソッド
    「勉強する」動作を表現しています。学習進捗の管理や通知機能など、実際のロジックに応じて拡張可能です。

3. Main メソッド内での実行例

  • インスタンス生成とプロパティの設定
Student student = new Student();
student.Name = "太郎";
student.Age = 20;
student.School = "〇〇小学校";
  • NameAge は基底クラス (Person) で定義されているため、Student でも利用可能です。
  • School は派生クラス (Student) で独自に追加したプロパティです。
  • メソッドの呼び出し
student.Walk();   // 基底クラス (Person) のメソッド
student.Study();  // 派生クラス (Student) のメソッド

継承のメリット

  1. コードの再利用性
    共通のプロパティやメソッドを基底クラスで定義し、派生クラスで再利用できます。
  2. 拡張性
    派生クラスに新しいプロパティやメソッドを追加することで、具体的な機能を拡張できます。
  3. 保守性
    共通部分が基底クラスに集約されるため、修正や変更が一か所で済み、保守が容易になります。

今後の発展

  1. オーバーライド (override / virtual)
    基底クラスのメソッドに virtual を付け、派生クラスで override することで動作を上書きできます。
public override void Walk()
{
    Console.WriteLine("学生が急いで歩いています...");
}
  1. 抽象クラス (abstract)
    メソッドの実装を強制する場合に abstract キーワードを使用する方法があります。
  2. インターフェース (interface)
    振る舞いの契約のみを示し、クラス間の依存を減らす設計が可能です。

まとめ

このサンプルでは、C# における継承の基本を分かりやすく解説しました。
基底クラスで共通のプロパティやメソッドをまとめ、派生クラスで固有の機能を追加することで、再利用性や保守性を向上させることができます。実際のプロジェクトでは、継承を適切に活用し、可読性や拡張性の高い設計を心がけましょう。


やってみよう

会社員を追加してみよう

using System;

namespace InheritanceExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // Studentクラスのインスタンスを生成
            Student student = new Student();

            // 基底クラス Person から継承した Name, Age プロパティを設定
            student.Name = "太郎";
            student.Age = 20;

            // Studentクラスで追加した School プロパティを設定
            student.School = "〇〇小学校";

            // Personクラスから継承したWalkメソッドの呼び出し
            student.Walk();

            // Studentクラス独自のStudyメソッドの呼び出し
            student.Study();

            // Employeeクラスのインスタンスを生成
            Employee employee = new Employee();

            // 基底クラス Person から継承した Name, Age プロパティを設定
            employee.Name = "花子";
            employee.Age = 30;

            // Employeeクラスで追加した Company, JobTitle プロパティを設定
            employee.Company = "〇〇株式会社";
            employee.JobTitle = "エンジニア";

            // Personクラスから継承したWalkメソッドの呼び出し
            employee.Walk();

            // Employeeクラス独自のWorkメソッドの呼び出し
            employee.Work();
        }
    }

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

        /// <summary>
        /// 年齢
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 人が歩く動作を表すメソッド
        /// </summary>
        public void Walk()
        {
            Console.WriteLine($"{Name} が歩いています...");
        }
    }

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

        /// <summary>
        /// 学生が勉強する動作を表すメソッド
        /// </summary>
        public void Study()
        {
            Console.WriteLine($"{Name} が勉強しています...");
        }
    }

    /// <summary>
    /// 会社員を表す派生クラス (Person クラスを継承)
    /// </summary>
    class Employee : Person
    {
        /// <summary>
        /// 会社名
        /// </summary>
        public string Company { get; set; }

        /// <summary>
        /// 職種
        /// </summary>
        public string JobTitle { get; set; }

        /// <summary>
        /// 会社員が働く動作を表すメソッド
        /// </summary>
        public void Work()
        {
            Console.WriteLine($"{Name} が {Company} で {JobTitle} として働いています...");
        }
    }
}

C#,継承,設計

Posted by hidepon