【C#】クラス名<T>って何?ジェネリッククラスについて。

最近、Unity絡みでC#を勉強しています。
様々なソースコードを読んでいるのですが、次のような関数に出くわす事がありました。

public クラス名<T> 

最初は、Tという言葉が何を指し示しているのかわかりませんでしたが、色々調べて行く中でジェネリッククラスと呼ばれるクラスである事がわかりました。

さて、
今回は、ジェネリッククラスがどういう物であるかの概念的な所に触れたいと思います。

ジェネリッククラスとは

公式では次のように説明されています。

ジェネリック クラスは、特定のデータ型に固有ではない操作をカプセル化します。

ジェネリック クラス (C# プログラミング ガイド) | Microsoft Docs

要は、クラス内の関数は一緒で、型だけが違うクラスを一緒に出来るという事です。

もう少し詳しい説明

例えば、色々な焼き物が作れる機械があるとします。

便宜上これを、「ホットスナックメーカー」と言います。
このホットスナックメーカーは、似たような処理で作れる、「たい焼き」と「ホットサンド」があります。

中身の味自体は、インスタンスを作る時に指定は出来ます。 しかし、二つの違いは、出来上がった時の皮の型が違います。

  • 「ホットサンド」はint型(整数型)
  • 「たい焼き」はfloat型(少数型)

出来上がりの型が違うので下記のように、関数を分ける必要があります。 f:id:nakahashi_h:20180723024556p:plain

しかし、関数の中身はほぼ同じなので、似たような処理が2つあり、管理のしやすさが落ちます。

ジェネリッククラスにすると?

ジェネリッククラスで作り直すと次のようになります。 f:id:nakahashi_h:20180723024929p:plain

クラスのインスタンスを作成する時に、一緒に型を指定する事が出来ます。 クラスの中では、指定したクラスがTに代入されます。
そのため、クラス内でわざわざ型を指定する必要がなくなり、関数も共通で使えるようになりました。



以上です。
jsやPHPのように型が比較的緩い言語であればジェネリックの概念を使う機会はあまりないかもしれません。
しかし、C#をはじめとした多くの言語は型が厳格なので、上記の言語から参入した人間だと少し頭をひねる必要があるようです。