Unityで学ぶC#インナークラスとアクセス修飾子の学習

この資料では、C#におけるインナークラス(内部クラス)の定義方法と、アクセス修飾子が未指定の場合に起こるコンパイルエラーについて学習します。特に、意図的にエラーが発生するケースを例にとり、なぜエラーになるのか、どう対処すべきかを理解します。


1. サンプルコードの紹介

以下のコード例は、UnityのMonoBehaviourを継承したDriverクラスと、Carクラス内に定義されたインナークラスEngineを利用しています。

using UnityEngine;

public class Car
{
    Engine _engine;

    public Car()
    {
        _engine = new Engine();         // Car内部でEngineのインスタンス生成
    }

    class Engine  // ここはアクセス修飾子が指定されていないため、デフォルトでprivate
    {
        public Engine()
        {
            Debug.Log("エンジンを作ったよ");
        }
    }
}
using UnityEngine;

public class Driver : MonoBehaviour
{
    void Start()
    {
        var car = new Car();            // CarのコンストラクタでEngineが生成される
        var engine = new Car.Engine();  // インナークラスEngineのインスタンス生成(※エラー発生)
    }
}

2. エラーが発生する理由

アクセス修飾子のデフォルト動作

  • デフォルトがprivate:
    C#では、クラス内部に定義されたクラスはアクセス修飾子が指定されなければprivateになります。
    そのため、Carクラス内で定義されたEngineクラスはCarクラスの外部からはアクセスできません。

エラー発生のケース

  • Driverクラスでのアクセス:
    DriverクラスのStart()メソッドで以下のコードを実行しようとすると、
var engine = new Car.Engine();


Engineクラスはprivateのため、外部からアクセスできずコンパイルエラーが発生します。


3. 学習ポイントと意図

この資料は、「エラーになる前提」でインナークラスのアクセス制御を理解するための学習資料です。

  • インナークラスの役割:
    内部クラスは、関連するクラスの詳細実装を隠蔽し、カプセル化を実現するために使われます。
  • アクセス修飾子の重要性:
    インナークラスがデフォルトでprivateとなるため、外部で使用する必要がある場合は明示的にpublicなど適切なアクセス修飾子を設定する必要があります。
  • 学習の目的:
    このサンプルは、プログラムの設計上、どのような場面でアクセス制御が必要なのかを理解するための教材です。エラーが発生する状況を把握し、正しいアクセス修飾子の利用方法を学んでください。

4. エラー解決方法(参考)

学習目的の資料ではあえてエラーになる例として示しましたが、もし外部からEngineクラスにアクセスする必要がある場合は、以下のようにアクセス修飾子を変更することでエラーを解消できます。

public class Car
{
    Engine _engine;

    public Car()
    {
        _engine = new Engine();
    }

    public class Engine  // publicに変更
    {
        public Engine()
        {
            Debug.Log("エンジンを作ったよ");
        }
    }
}

この変更により、Driverクラスからもnew Car.Engine()でインスタンスを生成できるようになります。


5. まとめ

  • エラーの原因:
    インナークラスEngineは、アクセス修飾子が指定されていないため、デフォルトでprivateとなり、Carクラスの外部からアクセスできません。
  • 学習のポイント:
    インナークラスを利用する際は、必要に応じてアクセス修飾子を正しく設定し、カプセル化とアクセス制御のバランスを取ることが大切です。

この資料を通じて、C#におけるインナークラスの基本的な動作と、アクセス修飾子の役割について理解を深めてください。

Unity

Posted by hidepon