2012年2月26日日曜日

2.2 型をもっともっと詳しく

前回の「型をもっと詳しく」で、型の階層構造、型の親子関係について学びました。
今回は、親子関係についてさらに詳しくみていき、さらに、型についての新しい概念も紹介します。



親子関係は読んで字のごとく、親と子の関係を表しています。
子は親を引き継ぎます。そして成長して親を超えることで立派な個体となるのです。
「おいおい、いきなり何の話だ」
って感じですが、これはプログラミングでの型にも共通する考え方です。

つまり、型の子は、その親の機能を引き継ぐのです。ただし子は、本質的には親と同じです。
さて、これはどういうことでしょうか。詳しく解説しましょう。



前回で例にあげた、剣(剣型)をもう一度思い出してください。
剣型は、武器型の子です。逆に、武器型は剣型の親です。

これを、もっとシンプルな言葉に置き換えましょう。

「剣は武器です。」

・・・・・・当たり前ですね。
ただし

「武器は剣です。」

・・・・・・なんだか違和感があります。


なぜかというと、武器は、剣のほかに銃も弓もハンマーも、すべてを含んでいるからです。
逆に、剣は武器の一部であり、武器から派生したものの1つであるため、
「剣は武器です」は自然になりたつのです。

派生、つまり、剣は武器を引き継いだ型であるということができます。
そして、引き継いでいるため、剣は武器であり、なおかつ、武器以上の何かを備えています。
たとえば、切る(斬る)、刺す、細長い、錆びるなどの、剣ならではの機能や特徴があります。

ただし、機能や特徴を付け加えられても、剣は、本質的には武器です。
どれだけ形を変えて色を変えて機能を付け加えても、武器ということに変わりはありません。


これが、親子関係です。

子は親から派生し、親にはない機能を有することができます。
ただし、派生元の親の存在が消えることはなく、あくまで、親の機能拡張にすぎません。
この、親から派生させて子という新しい型を作ることを、「継承」と呼びます。

親子関係は、そのまま「継承関係」と言うことができます。
そして、親から見た子は「継承先(の型)」、子から見た親は「継承元(の型)」となります。


剣のほかに、いくつか例を出してみましょう。


「スライム型の継承元はモンスター型である」
「職業型の継承先には、戦士型や魔法使い型などがある」
「手乗りドラゴンの親はドラゴン、その親はモンスター、その親は生物である」


例の3つ目のように、親子関係はいくつも連鎖します。
ただし、子孫関係とはあまりいいません。
あくまで、型が別の型に派生して、その2つを親子関係、継承関係というだけで、
どのくらいの派生が行われたかはあまり気にしません。


さて、実際のゲーム開発ではこの「継承」を頻繁に行います。
最初にモンスター型を実装して、それを継承して雑魚モンスターやボスモンスターなどを実装したり、
武器型を実装して、剣を実装して、さらにそれを継承して両手剣や巨大剣などを実装したり・・・・・・
などなど、あらゆるシーンで継承が用いられます。

Unityによるゲーム開発でも、型の継承は大切な概念です。
ですので、ここで学んだ知識はかならず、Unityでスクリプトを書くときに役立ちますし、
今はまだ具体的なスクリプト・プログラムは書きませんが、この知識があればすんなり見につくでしょう。



ここままで、型と、型の継承については学びました。
では、前回の例で出た「毒属性の剣」はどうでしょうか。

ここまで学んだ知識を用いると、剣を継承して、毒属性の剣をつくる、ということになります。


しかし、残念。
それは間違いです。



たとえば、毒属性は剣のほかにも使い道はありそうです。
毒属性の盾もあれば、毒属性の弾丸もりますし、毒属性の魔法もあるでしょう。

剣を実装して、それを継承して毒属性の剣を実装しても、ほかに毒属性の盾も弾丸も魔法も
実装しなければなりません。
その場合、継承するたびに、毒属性のプログラムを書き直さなければなりません。
これでは、いつまでたってもプログラマは家に帰ることができないでしょう。


これで、継承だけでは解決しないということがわかりました。
継承は万能のツールではないのです。

では、「毒属性の剣」はどうやって実装したらいいのでしょう?
その解決策として、型の継承ではなく、型の組み合わせを用います。

型はバラバラに存在していますが、それらの機能を組み合わせて別の型にすることができます。
「毒属性の剣」では、「毒属性」と「剣」を組み合わせるだけでできます。
こうすると、毒属性だけを用意しておけば、弾丸と組み合わせるだけで「毒属性の弾丸」ができますし、
魔法と組み合わせれば「毒属性の魔法」も作ることができます。

毒属性のほかに回復属性を作れば、同じ要領で「回復属性の弾丸」や「回復属性の魔法」もすぐに実装できますね。


さらに、組み合わせはいくつでもできるため「回復属性と魔力強化属性の杖」や「光属性と闇属性の指輪」など、
型のバリエーションがいくらでも増やすことができます。

これをプログラムで実現する場合、「包含」「多重継承」などが用いられます。
ことばが2つ出てきましたが、これは、その組み合わせをどう実装するかの方法によって左右されるからです。
いつ、どういうときに、包含と(多重)継承を用いるかについては、経験がものをいいます。
どちらでも実装できる場合もあるし、どちらかでしか実装できない場合もあります。
また、継承でも包含でもいい場合もあります。

このあたりについては、実際にプログラムを書いて経験しないとわからないので、
これ以上詳しい解説は避けます。
今説明しても、逆に混乱するだけだからです。


大事なのは「継承」「多重継承」「包含」という、型についての関係性を理解することです。
この概念を理解できているか否かで、プログラムを書くときの考え方が変わってきます。


いくつか例にも出したとおり、プログラムでは継承や包含が常に出てきます。
Unityでゲームプログラミングをするときにも、もちろんこれらの知識はあったほうが断然有利です。
なので、今は説明ばかりでつまらないかもしれませんが、是非ともこの知識を身につけてください。

最初に説明したとおり、C#は型の集合です。
これは、型についての上記の関係(継承、多重継承、包含)の集合であるとも言えます。
それほど、型という概念は重要なので、一番最初に紹介しました。

これから先、いくつも用語や概念が出てきますが、どれも型の考えが関わってきまし、
型なしではC#でプログラムは書けませんし、Unityでゲーム開発もできません。




さて、ちょっと駆け足気味でしたが、今回で型についての説明はだいたい終了です。
お疲れ様でした。

次回からは、この型の考えをベースとした項目を勉強します。
型についてまだちょっと自身がない場合は、これまでの型の解説をもう一度読み直してください。


では。

0 件のコメント:

コメントを投稿