見出し画像

UnityLearn Scripting Tutorials -Inheritance-日本語

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

日本語訳

Unityがサポートするスクリプト言語には、継承と呼ばれる機能があります。

継承は、オブジェクト指向プログラミング、略してOOPの基礎の1つです。

別のクラスから継承することで、そのクラスの機能を得ることができます。

継承について説明する時は、継承されるクラスを「Parent(親)」や、基底クラスと呼ばれます。

継承しているクラスを「Child(子)」や、派生クラスと呼びます。

継承の結果として、parentクラスにある要素はchildクラスでも利用可能になります。

したがって、メソッドや変数はparentクラスであるかのように使うことができます。

例えば、ClassAというparentクラスがあると仮定します。それは、Dance()とSing()メソッドを持っています。

ClassAを継承するClassBがあった場合、ClassBもDance()とSing()の2つのメソッドを持ちます。

それらのメソッドはClassAで既にあるためClassBで作る必要はありません

継承を扱うときは、3つのアクセス修飾子、Public, Private, Protected があります

Public, Private については、既に理解しているとします。

注意することは parentクラスのPublicな機能は子クラスに存在しアクセス可能ですが、Privateである機能は子クラスに存在しますがアクセスできません。

Protectedアクセス修飾子はPublic とPrivateのハイブリットとして機能します。

Parentクラスの全てのProtected な機能はchildクラスではPublic な機能のようにアクセスかのうですが、外部からは、Private な機能のようにアクセスできません

これまでUnity で使ってきたクラスの多くが、継承されたものである可能性があります。

実際、GameObjectのコンポーネントとして適用されるスクリプトはMonoBehaviourdです。

つまり、全てMonoBehaviourを継承したクラスであるのです。

Unityで作られたデフォルトのスクリプトは次の形式に従います。

public class クラス名 : MonoBehaviour

クラス名の後のコロンは、スクリプトがMonoBehaviourから継承されたことを意味します。

ほかのクラスから継承されたクラスを作るには、MonoBehaviourの部分をほかのクラス名に変えるだけです。

parentクラスを継承しないようにするには、コロンとparentクラス名を削除するだけです。

なぜスクリプトがMonoBehaviourから継承されるのか疑問に思われるかもしれません。

GameObject、Transform、Start()、Update()などの要素はすべて、MonoBehaviourから来ています。

スクリプトはこのMonoBehaviourを継承しているので、これらの機能にアクセスできます。

継承構造は階層的です。

継承について考えるときは動物界について考えるのが一般的です。

この例では「Animal」というparentクラスがあります。

このクラスには動物のような行動をするために必要な定義、プロパティが含まれています。

このAnimal基底クラスから、脊椎動物と無脊椎動物の2つのchildクラスを作ったとします。

脊椎動物クラスは哺乳類、爬虫類、両生類などのより多くのクラスのparentクラスになります。

これらのchildクラスは基底クラスから、情報を受け取り、追加していきます。

動物での例のように、オブジェクト指向プログラミングの継承はIs-A関係として知られています。

これは、childクラスはparentクラスであるということです。

「爬虫類 Is 脊椎動物」

「哺乳類 Is 動物」

Unityで出会ったことがあるものの例では、「”Capsule Collider” Is “Collider” 」です。

この概念は下のリンクのポリモーフィズムのレッスンで、解説しています。

継承の考え方はゲーム開発では非常に便利に利用でき、役に立ちます。

例えば「Humanoid」というクラスがあったとします。

このクラスはhumanoidがゲーム内すること全てをカバーしています。

次にEnemyとPlayerの2つのchildクラスがあります。

これらはHumanoidクラスのすべてのメンバを継承しているため、playerとenemyがゲームでどのように動作するかを細かく制御します。

次に、そのEnemyクラスのchildクラスとして、Orc(オーク)とGoblin(ゴブリン)を作ります。

これらはenemyのように振る舞い、そしてhumanoidのようにも振る舞います。

このようにして、HumanoidとEnemyのコードを再利用しているのでOrcとGoblinを思い通りに動かすためのコードがはるかに少なくなりました。

コンストラクタはchildクラスから継承されますが、共有されないクラス固有のものなので例外です。

しかし、childクラスからコンストラクタが呼ばれたときは、そのparentクラスのコンストラクタがそのあとすぐに呼び出されます。

クラスは多くの異なるコンストラクタを持つことができるので、どの基底クラスのコンストラクタを呼び出すか制御できるようにしたいときはあります。

それには、「base」キーワードを使います。

Childのコンストラクタのパラメーターリストの後にコロンを付けることで、基底コンストラクタのパラメーターリストに「base」キーワードを用いて基底クラスの特定のコンストラクターを明示的に呼び出すことができます。

基底クラスのコンストラクターが明示的に呼び出されない場合でも、デフォルトのコンストラクターは暗黙的に呼び出されます。

基底クラスのコンストラクターを呼び出す以外に、「base」キーワードを使用して基底クラスの他のメンバーにアクセスすることもできます。

これは派生クラスとは異なるため、何かの基底クラスのバージョンにアクセスしたい場合に役立ちます。

これは、関数をオーバーライドするときによく発生します。

これについて詳しくは、以下のリンクされているオーバーライドに関するレッスンを見てください。

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

Summary

・継承はOOPにおいて重要な機能である。
・protectedアクセス修飾子を使うことで、privateとpublicの間のような制限ができる。
・コードを再利用することで、多くの機能を簡単に利用できるようにし、バグの予防、時間の短縮、にもなる。

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

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


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