UnityLearn Scripting Tutorials -Polymorphism-日本語
UnityLearnのチュートリアルを日本語に翻訳したものです。
素人の翻訳なので間違いがあると思います。
間違いを見つけた人はコメントでおしえていただけると嬉しいです。
日本語訳
ポリモーフィズムとは継承の機能の1つで、クラスが複数の型を持つことを可能にします。
継承のヒエラルキー内(階層構造内)では、どのchildクラスもparentクラスであると言えます。
つまり、基底クラスが必要なときはいつでも、派生クラスは基底クラスを代わりに使用できます。
継承ヒエラルキーを使うゲームがあり、Enemyクラスから派生したOrc(オーク)とGoblin(ゴブリン)があるとします。
これらは、順にHumanoidクラスから派生されています。
今やりたいことは、シーン内の全てEnemyオブジェクトのコレクション(collection)を作ることだとしましょう。
この場合、全Orcのコレクション、と全Goblinのコレクションという、2つのコレクションを持つのではなく、OrcオブジェクトとGoblinオブジェクトの両方が要素になる可能性のあるEnemyオブジェクトのコレクションを1つ持つことができます。
同様に、Humanoidから派生したPlayerを持っている場合は、シーン内の全てのHumanoidオブジェクトのコレクションを作ることができます。
そして、それはOrc, Goblin, Player全てを含みます。
ポリモーフィズムは、関数のパラメーターなどにも使用できます。
OnTrigger()関数を考えてみましょう。
一般的に、OnTrigger()関数は「other」と通常呼ばれるColliderパラメーターを持っています。
GameObjectsにはColliderコンポーネントがありません。
しかし、Box Collider, Sphere Collider, Mesh Colliderといったようなものを持っています。
OnTrigger()が呼ばれたとき、どのColliderの型が使われたかはわかりません。
実際には、それぞれのオブジェクトの特定のColliderがその関数に渡されます。
これら全ての異なるColliderはColliderのparentクラスを継承しているため、どれでも機能します。
知るべき重要なことは、逆(opposite)が不可能であることを知ることです。
先ほどの例を使うと「Orc Is Enemy」です。
しかし、「Enemy Is NOT Orc」です。
childクラスに何かを要求して、parentクラスに与えることはできません。
ポリモーフィズムの少し賢い使い方の1つに、コンストラクタとオブジェクト参照があります。
基底クラスのオブジェクトの型を宣言でき、その派生クラスのコンストラクタを呼ぶことができます。
これは、変数の参照が基底クラスの型を要求しているからです。
そして、childクラスのコンストラクタは派生クラス型のものを作成します。
これがわかりにくい場合は、「childクラス Is parentクラス」であることを覚えておいてください。
したがって、この変換は機能し、アップキャストと呼ばれるプロセスです。
オブジェクトはアップキャストされますが、parentクラスのオブジェクトとしてのみ扱うことができます。
この例のように、ChildClass()がアップキャストされたとしても、ParentClassとしてのみ扱うことができます。
つまり、ParentClassで使用できる変数、メソッドのみが使用でき、ParentClassのオブジェクト内にあるかのように扱われます。
例外は、オーバーライドされた仮想関数を呼び出すことです。
仮想関数とそれらのオーバーライドの詳細については、以下にリンクされているオーバーライドのレッスンを参照してください。
このChildClassをchildクラスのように扱うには、ChildClass変数をChildClass型にダウンキャストする必要があります。
これをするには、型の名前を()でくくり、変数の前に置きます。
これを、別の()でくくりドット演算子を使ってメンバにアクセスできます、これを参照にして新しいバージョンを作ることもできます。
<終>(2020/4/26)
———————————————————————
Summary
・ポリモーフィズムによって、クラスが複数の型を持つことが可能になります。
・コンストラクタ、オブジェクト参照は、ポリモーフィズムの使い方の1つです。
・アップキャスト、ダウンキャスで、クラスを柔軟に使えるようになる。
———————————————————————
そのほかの日本語訳の記事はこちらから
この記事が気に入ったらサポートをしてみませんか?