はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】ジェネリックについてかるくまとめてみた

はじめに

今回はジェネリックについての記事になります!

みなさんジェネリックと聞いて「医薬品」を思いついた人がいるのではないでしょうか?

私は最初にそれにか思いつきませんでした。

調べてみるとジェネリックには「一般的な」という意味があるようです。

その意味から「ジェネリック医薬品」とは一般的に広く使用され、効能や安全性が確立された医薬品の事を意味するそうです。
ジェネリック医薬品ってなんだろう?| 日新製薬株式会社 日新薬品株式会社

・・・と話が大きくそれてしまって申し訳ありません。

ただ型を一般的にするという意味ではあながち遠い存在ではないのかもしれません。

まずはジェネリックの概要からみていきましょう!

ジェネリックとは

短くまとめると、ジェネリックはパラメーター化された型のことです。
つまりはintstringといった型を引数として渡せるということになります。

ジェネリックには様々のものに用いることができ、ジェネリッククラス」「ジェネリック構造体」「ジェネリックインターフェイス」「ジェネリックメソッド」「ジェネリックデリゲート」があります。

またジェネリッククラス」と「ジェネリック構造体」は自分が型に分類されるものは、「ジェネリック型」と呼ぶようです。

ジェネリックの使い方

今回は例でジェネリッククラスを作ってみたいと思います。

using UnityEngine;

/// <summary>
/// ジェネリッククラス
/// Tという名前の型パラメーターを1つ持つ
/// </summary>
public class MyGenericClass<T>
{
    private readonly T _item;               //T型の変数を宣言

    /// <summary>
    /// コンストラクター
    /// </summary>
    public MyGenericClass(T item) {
        _item = item;
    }

    /// <summary>
    /// T型のオブジェクトを戻り値として返す
    /// </summary>
    public T GetItem()
    {
        return _item;
    }

}

public class Hoge : MonoBehaviour
{
    private void Start()
    {
        //型パラメーターにint型をあてはめ、MyGenericClass<T>オブジェクトを作成
        MyGenericClass<int> myGenericClass = new MyGenericClass<int>(15);

        Debug.Log(myGenericClass.GetItem());  //15
    }
}

このようにclass MyGenericClass<T>とすることでジェネリッククラスを宣言することができます。

また、MyGenericClass<int>のように実際の型を当てはめたものは「クローズ構築型」といい、
逆にMyGenericClass<T>のようにTの型が未確定の場合は「オープン構築型」と呼びます。

さらに、型パラメーターに実際に当てはめる引数のことを、「型引数」と呼ぶようです。

型パラメーターに制限を与える

上の例だと、型パラメーターTにはどんな型も当てはめることができます。
しかし、想定外の型を当てはめるのは予期せぬエラーが発生してします可能性があります。

この対策としてC#では型パラメーターに制約を加えることができます

class クラス名<型パラメーターのリスト> where 型パラメーター : 制約 { //...

型パラメーターのリストというのは、ジェネリックの型パラメーターには複数指定できるので(<T, V>のように)リストと表現しています。

また制約には以下の5種類が存在します。
・基本クラス制約
インターフェイス制約
コンストラクター制約
・参照型制約
・値型制約

これを一つ一つ紹介したいと思うのですが、別記事にて紹介したいと思います。

さいごに

ジェネリックを用いることでより抽象的なプログラミングができるはずです。
うまく活用していきましょう!