インターフェースは、C#を含む多くのオブジェクト指向プログラミング言語における重要な概念で、クラスや構造体が実装すべきメソッド、プロパティ、イベントなどの契約(仕様)を定義します。インターフェースは、実装を持たないメソッドのシグネチャのみを定義し、実際の動作はそれを実装するクラスによって提供されます。
実装の分離: インターフェースは、実装を持たず、メソッドのシグネチャのみを定義します。これにより、実装と使用を分離できます。
多重継承: C#ではクラスの多重継承がサポートされていませんが、インターフェースは複数実装することができ、これにより異なる型の機能を統一的に扱うことができます。
ポリモーフィズム: インターフェースを使用することで、異なるクラスが同じインターフェースを実装し、共通のメソッドを呼び出すことができるため、コードの柔軟性と再利用性が向上します。
依存性の逆転: インターフェースを使用することで、クラスは具体的な実装に依存せず、インターフェースに依存することができ、これにより変更に強い設計が可能になります。
以下は、インターフェースを定義する例です。このインターフェースは、IDriveable
という名前で、Drive
メソッドを持っています。
public interface IDriveable
{
void Drive(float distance);
}
以下は、IDriveable
インターフェースを実装するCar
クラスの例です。
public class Car : IDriveable
{
public void Drive(float distance)
{
Debug.Log("Driving " + distance + " kilometers.");
}
}
public class Program
{
public static void Main()
{
IDriveable myCar = new Car();
myCar.Drive(10); // "Driving 10 kilometers."
}
}
Unityでもインターフェースは非常に便利で、特に複数のコンポーネントやオブジェクトに共通の機能を持たせる場合に使用されます。以下は、Unityでのインターフェースの使用例です。
using UnityEngine;
public interface IInteractable
{
void Interact();
}
public class Door : MonoBehaviour, IInteractable
{
public void Interact()
{
Debug.Log("Door opened!");
}
}
public class Button : MonoBehaviour, IInteractable
{
public void Interact()
{
Debug.Log("Button pressed!");
}
}
public class Player : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
// 近くのIInteractableオブジェクトを取得してInteractを呼び出す
IInteractable interactable = GetInteractable();
interactable?.Interact();
}
}
IInteractable GetInteractable()
{
// 適当なロジックでIInteractableを取得
// ここではダミーで返します
return FindObjectOfType<Door>(); // 例としてDoorを取得
}
}
インターフェースを使用することで、柔軟で拡張性のあるコードを書くことが可能になります。