基礎から学ぶC#入門 90日コース | 継承・抽象化・インターフェース - Day 41:継承

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 41 のゴールと全体像

第5章では、オブジェクト指向をもう一段深く掘り下げていきます。 Day 41 のテーマは 「継承」

キーワードはこの3つです。

  • 基底クラス
  • 派生クラス
  • 共通処理

「継承」という言葉だけ聞くと少し堅く感じますが、 イメージとしては、

「共通する部分を親クラスにまとめて、子クラスがそれを引き継いで使う仕組み」

だと思って読んでいただくと、ぐっと分かりやすくなります。

継承のざっくりイメージ

「似ているけれど、少し違うもの」をどう表現するか

たとえば、こんな2つのクラスを考えてみます。

  • 社員クラス Employee
  • 管理職クラス Manager

どちらも「人」であり、

  • 名前
  • 年齢

といった共通の情報を持ちますが、

  • 社員は「所属部署」を持つ
  • 管理職は「役職名」や「部下の一覧」を持つ

など、少しずつ違いがあります。

このとき、

  • 共通部分を「基底クラス」にまとめる
  • それを「派生クラス」が引き継いで、独自の部分を足す

というのが、継承の基本的な使い方です。

基底クラスを作ってみる

共通する「人」の部分を Person クラスにまとめる

まずは、共通部分だけを切り出した 基底クラス を作ります。

using System;

// 基底クラス:人としての共通部分を表す
class Person
{
    // 名前
    public string Name { get; set; }

    // 年齢
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // 共通の自己紹介メソッド
    public void Introduce()
    {
        Console.WriteLine($"私は {Name} です。年齢は {Age} 歳です。");
    }
}
C#

ここでは、

  • Person が「人としての共通部分」を表す基底クラス
  • 名前と年齢、そして自己紹介という共通処理を持っています

この Person を「親」として、 社員や管理職のクラスを「子」として作っていきます。

派生クラスを作る

Employee:Person を継承した社員クラス

継承は、クラス宣言のときに : を使って書きます。

// 派生クラス:社員
class Employee : Person
{
    // 社員固有の情報:所属部署
    public string Department { get; set; }

    public Employee(string name, int age, string department)
        : base(name, age) // 基底クラスのコンストラクタを呼び出す
    {
        Department = department;
    }

    // 社員としての自己紹介(共通処理+追加情報)
    public void IntroduceAsEmployee()
    {
        // 基底クラスの Introduce をそのまま使う
        Introduce();
        Console.WriteLine($"所属部署は {Department} です。");
    }
}
C#

ポイントはここです。

  • class Employee : Person → 「Employee は Person を継承している」という宣言
  • : base(name, age) → 基底クラス Person のコンストラクタを呼び出して、 名前と年齢を初期化している

派生クラスは、

「基底クラスの機能をそのまま使いつつ、自分だけの機能を足したクラス」

というイメージです。

Manager:Person を継承した管理職クラス

同じように、管理職クラスも作ってみます。

using System.Collections.Generic;

// 派生クラス:管理職
class Manager : Person
{
    // 管理職固有の情報:役職名
    public string Title { get; set; }

    // 部下の一覧
    public List<Employee> Subordinates { get; } = new List<Employee>();

    public Manager(string name, int age, string title)
        : base(name, age)
    {
        Title = title;
    }

    // 部下を追加するメソッド
    public void AddSubordinate(Employee employee)
    {
        Subordinates.Add(employee);
        Console.WriteLine($"{employee.Name} さんを部下として追加しました。");
    }

    // 管理職としての自己紹介
    public void IntroduceAsManager()
    {
        Introduce(); // Person の共通自己紹介
        Console.WriteLine($"役職は {Title} です。部下の人数は {Subordinates.Count} 人です。");
    }
}
C#

ここでも、

  • ManagerPerson を継承している
  • 名前と年齢は Person に任せている
  • 管理職固有の情報(役職・部下)を追加している

という構造になっています。

継承の「共通処理」を体感する

実際に使ってみる

Program から、PersonEmployeeManager を使ってみます。

class Program
{
    static void Main(string[] args)
    {
        // 社員を作成
        Employee e1 = new Employee("佐藤", 28, "営業部");
        Employee e2 = new Employee("鈴木", 30, "開発部");

        // 管理職を作成
        Manager m1 = new Manager("田中", 40, "部長");

        // 部下を追加
        m1.AddSubordinate(e1);
        m1.AddSubordinate(e2);

        Console.WriteLine();
        Console.WriteLine("=== 社員の自己紹介 ===");
        e1.IntroduceAsEmployee();
        e2.IntroduceAsEmployee();

        Console.WriteLine();
        Console.WriteLine("=== 管理職の自己紹介 ===");
        m1.IntroduceAsManager();

        Console.ReadLine();
    }
}
C#

ここで注目してほしいのは、

  • Introduce() という共通処理は Person に1回書くだけで、 EmployeeManager の両方で使えていること
  • 派生クラス側では「自分固有の情報」を足すことに集中できていること

です。

重要ポイント:

  • 継承は「共通処理を親にまとめて、子がそれを引き継ぐ」ための仕組みです。
  • 同じようなコードを何度も書かなくてよくなるので、 重複を減らし、保守性を高める効果があります。

「継承を使うときの考え方」を整理する

1. 共通部分を見つける

まずは、複数のクラスの中から「共通している部分」を探します。

  • 名前・年齢・住所などの「人としての情報」
  • 商品名・価格・在庫などの「商品としての情報」
  • 日付・タイトル・本文などの「記事としての情報」

こうした共通部分を、 基底クラスとして切り出します。

2. 基底クラスに「共通処理」を書く

次に、共通している処理を基底クラスにまとめます。

  • 自己紹介
  • 情報表示
  • 簡単なバリデーション

など、「どの派生クラスでも同じように動いてほしい処理」は、 基底クラスに書いておくと便利です。

3. 派生クラスで「固有の部分」を足す

最後に、派生クラスで「そのクラスだけの情報や処理」を足します。

  • 社員なら「所属部署」
  • 管理職なら「役職名」「部下一覧」
  • アルバイトなら「時給」

など、 「共通部分+固有部分」という構造を意識すると、 継承の設計が自然と見えてきます。

継承のテンプレート例

最後に、継承の基本形をテンプレートとしてまとめておきます。

基底クラス

class BaseClass
{
    public string CommonProperty { get; set; }

    public BaseClass(string common)
    {
        CommonProperty = common;
    }

    public void CommonMethod()
    {
        Console.WriteLine($"共通プロパティ: {CommonProperty}");
    }
}
C#

派生クラスA

class DerivedA : BaseClass
{
    public int SpecificValueA { get; set; }

    public DerivedA(string common, int specific)
        : base(common)
    {
        SpecificValueA = specific;
    }

    public void ShowA()
    {
        CommonMethod(); // 基底クラスの共通処理
        Console.WriteLine($"A 固有の値: {SpecificValueA}");
    }
}
C#

派生クラスB

class DerivedB : BaseClass
{
    public bool FlagB { get; set; }

    public DerivedB(string common, bool flag)
        : base(common)
    {
        FlagB = flag;
    }

    public void ShowB()
    {
        CommonMethod(); // 基底クラスの共通処理
        Console.WriteLine($"B 固有のフラグ: {FlagB}");
    }
}
C#

このテンプレートをベースに、

  • 「共通部分」を BaseClass に
  • 「固有部分」を DerivedA / DerivedB に

という形で、 自分なりの継承構造を試してみると、 継承の感覚がぐっと身近になります。

Day 41 のまとめ

Day 41 では、

  • 基底クラス:共通するデータと処理をまとめるクラス
  • 派生クラス:基底クラスを継承し、固有の部分を足したクラス
  • 共通処理:何度も書きたくない処理を親に集約する考え方

を、社員・管理職の例を通して学びました。

継承は、

「似ているけれど、少し違うもの」を きれいに整理して表現するための道具

です。

ぜひ、

  • 自分で「共通部分」と「固有部分」を持つクラスの組み合わせを考えてみる
  • 基底クラスを作って、派生クラスを2〜3個作ってみる

といった小さな練習を通して、 継承を 「難しい仕組み」ではなく、 コードを整理するための頼れる相棒として、少しずつ体に馴染ませていってください。

タイトルとURLをコピーしました