【Unity】クラスを隠蔽するサンプル
Unityでインナークラスを使って隠蔽するサンプルをみていきましょう
基本のコード
var car = new Car();
var Engine = new Car.Engine();
public class Car
{
private Engine _engine;
public Car()
{
_engine = new Engine();
}
private class Engine
{
public Engine()
{
Debug.Log("エンジンをかけた");
}
}
}
Unityでのサンプル
このコードサンプルは、Car
クラスとその内部クラスであるEngine
クラスの基本的な使い方を示しています。ここでは、Car
オブジェクトを作成するときにEngine
オブジェクトも自動的に生成され、エンジンがかかるというシンプルな概念を実装しています。
このコードサンプルでは、Car
クラスのインスタンス化は正常に機能しますが、Car.Engine
のインスタンス化がエラーを引き起こすことを示しています。これはEngine
がCar
の内部クラスであり、かつprivate
修飾子がついているため、Car
クラスの外部からアクセスできないためです。この点を説明するUnityのサンプルを以下に示します。
- 新しいC#スクリプトの作成: Unityエディタで新しいC#スクリプトを作成し、「CarExample」などと名付けます。
- スクリプトの編集: 作成したスクリプトを開き、以下のサンプルコードを追加または編集します。
using UnityEngine;
public class CarExample : MonoBehaviour
{
void Start()
{
// Carのインスタンス化は成功する。
var car = new Car();
// この行はコンパイルエラーになる。EngineはCarのprivateな内部クラスであるため、外部から直接インスタンス化できない。
// var engine = new Car.Engine();
}
}
public class Car
{
private Engine _engine;
public Car()
{
_engine = new Engine();
}
private class Engine
{
public Engine()
{
Debug.Log("エンジンをかけた");
}
}
}
- 説明の追加: 上記のコードには、
Car.Engine
のインスタンス化を試みる行がコメントアウトされています。この行をアンコメントすると、Engine
クラスへのアクセスがprivate
であるため、コンパイル時にエラーが発生します。このエラーは、Car
クラスの外部からその内部クラスであるEngine
を直接インスタンス化することはできないことを示しています。 - Unityエディタに戻る: このスクリプトをゲームオブジェクトにアタッチします。
- プレイしてテスト: Unityエディタのプレイボタンをクリックして、
Car
インスタンスが正常に作成され、「エンジンをかけた」というメッセージがコンソールに表示されることを確認します。
このサンプルは、内部クラスの可視性に関する重要なコンセプトを示しています。特に、private
内部クラスは、その親クラスの実装の詳細をカプセル化し、外部からの直接アクセスを防ぐために使用されます。このようなアプローチは、ソフトウェア設計の原則であるカプセル化と情報隠蔽を実践するうえで役立ちます。
ディスカッション
コメント一覧
まだ、コメントがありません