見出し画像

UnityLearn Scripting Tutorials -Generics-日本語

UnityLearnのチュートリアルを日本語に翻訳したものです。
素人の翻訳なので間違いがあると思います。
間違いを見つけた人はコメントでおしえていただけると嬉しいです。

日本語訳

ジェネリックとはクラスやメソッドなどにパラメーターとして型を渡すことができる機能です。

これにより、使うデータの正確な型を知らなくても、一般的にプログラムすることができるようになります。

以前より、GetComponent()メソッドが、ジェネリックを利用して探しているコンポーネントの型のタイプを取得していることは見ているでしょう。

GetComponent()とは、ジェネリックメソッドとして知られています。

それではジェネリックメソッドを作っていきましょう。

ここに、例としてシンプルなジェネリックメソッドがあり、最初に確認すべきところはそのジェネリックパラメーターです。

これは「T」という名前で<>で囲われています。

通常、もしくは仮のパラメーターがメソッド名の後に続きます。

Tは全ての型になることができるので、その名前は任意ですが、慣例的にTを用います。

同様に、複数のジェネリックパラメーターを使いたい時は、コンマの後に付け加えていくことができます。

その名前付けは、慣例で通常は「T」のパラメーターの後には「U」「V」と続きます。

ジェネリックな関数のパラメーターは3つに限定されているわけではありませんが、1つのジェネリック関数が3つ以上もつことは非常に希です。

私たちは今、このメソッドに結びついているジェネリック型は「T」であることがわかりました。

「T」はただのプレースフォルダーですが、そのメソッドが呼ばれた時は、最終的にその実際の型になります。

「T」の型が最終的にどのような形であっても、型としてTを使っているので、その型を返し、その型の引数をとります。

ジェネリック型で動くメソッドがあったとしても、このままではあまり便利ではありません。

では、ジェネリック型で何ができるでしょうか。

ジェネリック型がどのように機能するのかわからないので、できることは少ないです。

このジェネリックパラメーターはfloatからMonoBehaviourまで様々なものになれます。

パラメーターが何になるかわからないので、そのジェネリック関数上で実行できることは多くありません。

例えば、MonoBehaviourに2をかけることはできないし、floatのGamaObjectフィールドにアクセスすることもできません。

現時点では全てのC#クラスが暗黙的に継承しているクラスオブジェクトのように扱われます

では、どうすれば多くの操作を行えるでしょうか。

型の機能を知るためには、ジェネリックパラメーターに制約を設け、型を制限しなければなりません。

関数に制限をつけるには、「where」をパラメーターの後、関数本体の前、に書きます。

これの後に、制限するジェネリック型、今回の場合は「T」を続け、さらにコロンをつずけます。

コロンの後には、コンマで分けられた特定の制約があり、その制約は一般できに4つに分類されます。

「class」キーワードを使用して「T」が参照型であることを指定できます。そして「struck」キーワードで、値型であることを指定できます。

「new」キーワードに()を続けて使うと、パラメーターを持たないpublicコンストラクタを持つものであると指定できます。

クラス名を使うと、Tがそのクラスである、またはポリモーフィズムを通じて、そのクラスを継承していることを指定できます。

最後の分類はインターフェースです。

インターフェース名を使うと、そのインターフェースを継承していることを指定できます。

ジェネリックメソッドを使うためには、どの型を使いたいのか、指定しなければなりません。

次に、作ったジェネリックメソッドを使いたいと思います。

別のクラスからは、メソッド名に続けて、<>、型名を書きます。

次に()と引数を続けます。

ここまで説明してきた全ての機能はメソッドだけでなく、ジェネリッククラスやインターフェースにも適用できます。

クラスにジェネリック型を与えることで、クラス内のフィールド、プロパティ、メソッドに影響を与えることができます。

ジェネリッククラスを作ることは、ジェネリックの一般できな使い方であり、データ構造の実装を簡単にします。

ここで、ジェネリッククラスを見てみましょう。

このクラスはジェネリック型のTを使います。

つまり、クラス型として使っている全てのT型のインスタンスは、使われる時に、実際の型に置き換えられます。

このクラスは1つのT型の「item」というメンバ変数を持ちます。

また、このクラスはUpdateItem()という1つの引数をとりメンバの「item」に割り当てます。

このクラスのオブジェクトをインスタンス化するためには、Tの型を指定する必要があります。

クラス名の後に、<>を続け、指定したい型を書くことで、これができます。

これは、コンストラクターの名前を書いた後、コンストラクターパラメーターリストの前にも書かなければなりません。

ジェネリックの最も一般できな使い方はdictionaryやlistなどのコレクションに使うことです。

dictionaryやlistのさらに詳しい情報は、このレッスンの下のリンクを見てください。

<終>
———————————————————————

Summary

・ジェネリックを使うと型(type)をパラメーターとして、クラスやメソッドに渡せるようになる。
・ジェネリックパラメーター「T」の型を制限する事で様々な操作を行えるようにする。

———————————————————————

そのほかの日本語訳の記事はこちらから。


この記事が気に入ったらサポートをしてみませんか?