Unity & C# 学習教材

protected 修飾子

publicprivate は「どこからでも」と「同じクラスだけ」の 2 択でした。継承を使うと、派生クラスには見せたいが外部には隠したいメンバーが出てきます。この用途に使うのが protected です。

学習目標

前提知識


1. アクセス修飾子の一覧

修飾子 アクセス可能な範囲
public どこからでもアクセスできる
private 同じクラス内のみ
protected 同じクラス内、および派生クラス内
internal 同じアセンブリ(プロジェクト)内

privateprotected の違いは「派生クラスからアクセスできるかどうか」です。


2. protected の基本

書式:protected メンバーの定義

1
protected 型 メンバー名;
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
    protected void M() { Console.WriteLine("A.M"); }
}

class B : A
{
    public void N()
    {
        M();    // ✅ 派生クラスから呼べる
    }
}

A の外側から M() を直接呼ぶことはできません。

1
2
3
A a = new A();
// ❌ コンパイルエラー: protected メンバーは外部からアクセスできない
// a.M();

3. 継承チェーンでの到達範囲

protected メンバーは継承チェーン全体を通じてアクセスできます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
    protected void M() { Console.WriteLine("A.M"); }
}

class B : A
{
    public void CallM()
    {
        M();    // ✅ B から A の protected メンバーにアクセスできる
    }
}

class C : B
{
    public void CallM2()
    {
        M();    // ✅ C からも A の protected メンバーにアクセスできる
    }
}
1
2
A.M
A.M

4. internal について

internal は同じアセンブリ(同一プロジェクト)内であればどこからでもアクセスできます。

1
2
3
4
internal class A
{
    internal void M() { }
}

Unity のスクリプトでは通常 1 つのアセンブリ内で開発するため、internal の効果は public に近くなります。複数アセンブリ(DLL 分割・パッケージ分割)をまたぐ場合に意味を持ちます。


よくあるミス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
    protected void M() { }
}

// ❌ NG: 継承関係にない外部クラスからは呼べない
class X
{
    void Test()
    {
        A a = new A();
        // a.M();  // コンパイルエラー
    }
}

// ✅ OK: 派生クラスの内側から呼ぶ
class B : A
{
    void Test()
    {
        M();    // 呼べる
    }
}

まとめ


理解度チェック

  1. privateprotected の違いを一文で説明してください。
  2. 次のコードはコンパイルできますか?

    1
    2
    3
    4
    5
    6
    7
    
    class A
    {
        protected void M() { }
    }
    
    A a = new A();
    a.M();
    
  3. class C : B のとき、BA を継承しており Aprotected void M() があります。C から M() は呼べますか?
解答を見る
  1. private は同じクラス内のみ。protected は同じクラス内と派生クラス内からアクセスできます。
  2. できません。protected メンバーはクラスの外部から直接呼べません。
  3. 呼べます。protected は継承チェーン全体に届きます。

次のステップ

オーバーライドとポリモーフィズム では、virtualoverride を使って派生クラスでメソッドの動作を変える仕組みを学びます。