オブジェクト指向を学ぶ〜継承とコンポジションについて〜
ビームについて具体的に実装する前に
ビームオブジェクトと主人公オブジェクトの関係を文章に落とし込みつつ、
オブジェクトの性質を他のオブジェクトに持たせるための方法について
勉強したのでまとめます。
今回は継承とコンポジションについて具体例を交えつつ、
そのメリットを享受できるように解説していきます。
ゲーム画面に配置する”モノ”オブジェクトとして以下を挙げられます。
①主人公
②敵
③画面(背景)
④スコアボード(数字を表示するフレーム?)
⑤ビーム(主人公オブジェクトにおけるコンポジション)
⑥通常ビームと特殊ビーム(元ビームクラスのサブクラス)
※分かりやすくするために何もついていない⑤のビームを
以後は元ビームと呼ぶことにします。
※②③④は設計上出てきますがここでは関係ないです。
⑥ビームクラスにおいてコンポジションとかサブクラスという言葉が出てきました。
サブクラスについては以前、オブジェクト指向について学びましたが、
私自身の向学のために簡単におさらいしておきます。
クラスというのは継承ができるということでした。
あるクラスAをクラスBが継承すると
クラスAはクラスBの親クラスとなり
クラスBはクラスBの子クラスとなります。
この例では元ビームクラスは通常ビームクラスと特殊ビームクラスの親であり、
実際の世界においても子どもは親の遺伝子は持っているので
親の元ビームは通常ビームと特殊ビームが満たすべき性質を両方持たなくてはなりません。
性質を集合に例えると、元ビーム(親クラス)が持つ性質は和集合部分(共通部分)です。
なので、通常ビームと特殊ビームのそれぞれのクラスは
元ビームを継承したサブクラスとします。
次に⑤の元ビームクラスにおいてコンポジションという言葉が出てきました。
これも継承と同じく、オブジェクトの性質を他のオブジェクトに持たせるための一つの方法です。
ただし、継承のように全ての性質を引き継ぐのではなく、
ざっくりしたイメージとしては”変数として持つ”=所有物という感じです。
実際の世界を考えると分かりやすいですが、
ここで考えているビームオブジェクトは主人公が発射するものなので
主人公の所有物と考えることができます。
なので、主人公オブジェクトの中で保有物(コンポジション)として定義します。
コードロジックの概念的な構成としては以下のような感じです。
【主人公クラス】
@interface MyMachineClass : NSObject{
BeamClass *oBeam;//定義時に通常ビームとしてインスタンス化
BeamClass *sBeam;//定義時に特殊ビームとしてインスタンス化
}
【ビームクラス】
@interface BeamClass : NSObject{
CGPoint *pont;
}
@interface OrdinaryBeamClass : BeamClass{
}
@interface SpecialBeamClass : BeamClass{
}
主人公はコンポジションという形で
ビームクラスを保有します。
ビームクラスは宣言時にはBeamClassであるが、
インスタンス化される時にOrdinaryとSuperとして定義することで
サブクラスとして実体化されます。
なぜ最初からサブクラスとして定義しないかというと
恐らくビームは沢山発生させる必要があり
NSMutableArray等の配列(イメージとして弾倉、マガジン)に格納する必要があるためです。
※上記の例では分かりやすく、個別の弾丸をコンポジションとしていますが。。
そうすることで配列から取り出す時にordinaryなのかspecialなのか意識せずに取り扱えるからです。
継承の特徴として子が親の性質を受け継ぐと言いましたが、
上記の例ではBeamClassにサブクラスで共通して必要な情報、
例えば位置座標(CGPointオブジェクト)、攻撃力等を定義や
動作、例えばダメージを返す等のメソッドを定義しておけば
サブクラスであるOrdinaryとSpecialではそれらを記述しなくても使えます。
あとはそれぞれのサブクラスで差異部分だけ記述すれば良いです。
例えばOrdinaryBeamClassでは物理攻撃エフェクトのみ、
SpecialBeamClassで特殊エフェクトのみを記述します。
今日はオブジェクト指向のコンポジションと継承について学びました。
引き続き、開発を進めながらここらへんをしっかり学んでいきたいです。