Unity & C# 学習教材

継承

継承は、既存のクラス(基底クラス)のメンバーを別のクラス(派生クラス)に引き継ぐ仕組みです。派生クラスは基底クラスのメンバーをそのまま使えるほか、新しいメンバーを追加できます。

学習目標

前提知識


1. 継承の構文

書式:継承の定義

1
2
3
class 派生クラス名 : 基底クラス名
{
}
要素 説明
派生クラス名 新しく定義するクラスの名前
: 継承を表す記号
基底クラス名 メンバーを引き継ぐ元のクラス名
1
2
3
4
5
6
7
8
class A
{
    public void M() { Console.WriteLine("A.M"); }
}

class B : A
{
}

BA を継承しています。B のインスタンスから A.M() を呼び出せます。

1
2
B b = new B();
b.M();
1
A.M

2. 派生クラスへのメンバー追加

派生クラスには、基底クラスにないメンバーを追加できます。

1
2
3
4
5
6
7
8
9
class A
{
    public void M() { Console.WriteLine("A.M"); }
}

class B : A
{
    public void N() { Console.WriteLine("B.N"); }
}

B のインスタンスは M()N() の両方を持ちます。A のインスタンスは M() のみです。


3. base キーワード

base は、派生クラスから基底クラスのメンバーに明示的にアクセスするキーワードです。

書式:基底クラスのメンバーへのアクセス

1
base.メンバー名

書式:コンストラクタ連鎖

1
2
3
4
5
6
class 派生クラス名 : 基底クラス名
{
    public 派生クラス名(引数リスト) : base(引数リスト)
    {
    }
}
要素 説明
base.メンバー名 基底クラスのメンバーを呼び出す
: base(...) 派生クラスのコンストラクタから基底クラスのコンストラクタを呼ぶ

基底クラスにパラメーターありのコンストラクタしかない場合、派生クラスでは : base(...) が必須です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
    public int Value { get; }

    public A(int value)
    {
        Value = value;
    }
}

class B : A
{
    public B(int value) : base(value)
    {
    }
}

B のコンストラクタが呼ばれると、: base(value) によって先に A のコンストラクタが実行されます。


4. 継承チェーンと object

C# では、1 つのクラスが継承できる基底クラスは 1 つだけです(単一継承)。継承は何段でもつなげられます。

1
2
3
class A { }
class B : A { }
class C : B { }

class キーワードで定義したすべてのクラスは、明示しなくても暗黙的に object を継承します。object は C# におけるすべての型の共通基底クラスです。


よくあるミス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
    public A(int value) { }
}

// ❌ NG: 基底クラスにパラメーターなしコンストラクタがないため base(...) を省略するとコンパイルエラー
class B : A
{
    public B(int value) { }
}

// ✅ OK: base(...) で基底コンストラクタを明示的に呼ぶ
class B : A
{
    public B(int value) : base(value) { }
}

まとめ


理解度チェック

  1. class B : A における : は何を意味しますか?
  2. 基底クラス Apublic A(int x) しかないとき、派生クラス B のコンストラクタはどのように書きますか?
  3. 次のコードはコンパイルできますか?理由とともに答えてください。

    1
    2
    3
    
    class A { }
    class B : A { }
    class C : A, B { }
    
解答を見る
  1. BA を継承することを表す記号です。
  2. public B(int x) : base(x) { } と書きます。
  3. できません。C# は単一継承のため、1 つのクラスが継承できる基底クラスは 1 つだけです。

次のステップ

型変換と型チェック では、継承関係にある型の間での変換と確認方法を学びます。