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#におけるインナークラスの基本的な動作と、アクセス修飾子の役割について理解を深めてください。
ディスカッション
コメント一覧
まだ、コメントがありません