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#ここでも、
ManagerはPersonを継承している- 名前と年齢は
Personに任せている - 管理職固有の情報(役職・部下)を追加している
という構造になっています。
継承の「共通処理」を体感する
実際に使ってみる
Program から、Person・Employee・Manager を使ってみます。
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回書くだけで、EmployeeとManagerの両方で使えていること- 派生クラス側では「自分固有の情報」を足すことに集中できていること
です。
重要ポイント:
- 継承は「共通処理を親にまとめて、子がそれを引き継ぐ」ための仕組みです。
- 同じようなコードを何度も書かなくてよくなるので、 重複を減らし、保守性を高める効果があります。
「継承を使うときの考え方」を整理する
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個作ってみる
といった小さな練習を通して、 継承を 「難しい仕組み」ではなく、 コードを整理するための頼れる相棒として、少しずつ体に馴染ませていってください。

