【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のインスタンス化がエラーを引き起こすことを示しています。これはEngineCarの内部クラスであり、かつprivate修飾子がついているため、Carクラスの外部からアクセスできないためです。この点を説明するUnityのサンプルを以下に示します。

  1. 新しいC#スクリプトの作成: Unityエディタで新しいC#スクリプトを作成し、「CarExample」などと名付けます。
  2. スクリプトの編集: 作成したスクリプトを開き、以下のサンプルコードを追加または編集します。
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("エンジンをかけた");
        }
    }
}
  1. 説明の追加: 上記のコードには、Car.Engineのインスタンス化を試みる行がコメントアウトされています。この行をアンコメントすると、Engineクラスへのアクセスがprivateであるため、コンパイル時にエラーが発生します。このエラーは、Carクラスの外部からその内部クラスであるEngineを直接インスタンス化することはできないことを示しています。
  2. Unityエディタに戻る: このスクリプトをゲームオブジェクトにアタッチします。
  3. プレイしてテスト: Unityエディタのプレイボタンをクリックして、Carインスタンスが正常に作成され、「エンジンをかけた」というメッセージがコンソールに表示されることを確認します。

このサンプルは、内部クラスの可視性に関する重要なコンセプトを示しています。特に、private内部クラスは、その親クラスの実装の詳細をカプセル化し、外部からの直接アクセスを防ぐために使用されます。このようなアプローチは、ソフトウェア設計の原則であるカプセル化と情報隠蔽を実践するうえで役立ちます。

Unity

Posted by hidepon