Tonyu Lab
Contents

 
Top
About Us
About Tonyu
Tonyu Program Tech
0.基礎
1.条件節
2.クラスの継承
3.メソッド
4.コンストラクター
BBS
Link
 
Author: Nuntora

2.クラスの継承

 teki1、teki2、teki3と言ったように、似たようなクラスをたくさん作成された方は多いと思います。シューティングの場合、まっすぐ降りてくる敵、斜めに移動してくる敵、挙動不審な敵などなど様々な敵を作成されたことと思います。

---------------------------------------------------------------
teki1.tonyu
---------------------------------------------------------------
extends SpriteChar;
function onDie() {
appear(new Bomb(x , y ,$pat_bomb+0));
}
function atariHantei() {
for (t in $chars) { if ( ((t is Tama)||(t is Tama2)||(t is Jiki)) && crashTo(t) ) { if (t is Jiki) { //自機と接触した場合 t.die(); //自機を爆破
die(); //敵を爆破 } else {
hp=hp-1; //hpが1減る $score=$score+1; //Scoreに10ポイント加算 t.die(); //弾を消す if (hp<1) die(); //hpが1未満の場合はdie()を呼ぶ } } } } while (y<$screenHeight) {
y+=1;
atariHantei();
update();
} --------------------------------------------------------------- --------------------------------------------------------------- teki2.tonyu --------------------------------------------------------------- extends SpriteChar;
function onDie() {
appear(new Bomb(x , y ,$pat_bomb+0));
}
function atariHantei() {
for (t in $chars) { if ( ((t is Tama)||(t is Tama2)||(t is Jiki)) && crashTo(t) ) { if (t is Jiki) { //自機と接触した場合 t.die(); //自機を爆破
die(); //敵を爆破 } else {
hp=hp-1; //hpが1減る $score=$score+1; //Scoreに10ポイント加算 t.die(); //弾を消す if (hp<1) die(); //hpが1未満の場合はdie()を呼ぶ } } } } while (y<$screenHeight) {
y+=1; if (x<$myChar.x) x+=1; else x-=1;
atariHantei();
update();
} ---------------------------------------------------------------

これで、teki1とteki2は完成です。めでたしめでたし・・・。

と、言いたいのですが、
「同じ操作が繰り返されていると思ったときには、プログラムを短くするチャンスだと思ってください。」
おわかりいただけるかと思いますが、クラスはまたがっているものの、function onDie()とfunction atariHantei()は同じ操作を2度繰り返してあります。

このような場合に、「クラスの継承」という概念が必要になります。名前は複雑そうですが、行うことは簡単です。

  1. Superクラス(親クラス)の作成
  2. Childクラス(子クラス)のextendの後ろ側を親クラスのクラス名に変更
  3. 子クラスのFunctionを削除
---------------------------------------------------------------
teki.tonyu
---------------------------------------------------------------
extends SpriteChar;
function onDie() {
appear(new Bomb(x , y ,$pat_bomb+0));
}
function atariHantei() {
for (t in $chars) { if ( ((t is Tama)||(t is Tama2)||(t is Jiki)) && crashTo(t) ) { if (t is Jiki) { //自機と接触した場合 t.die(); //自機を爆破
die(); //敵を爆破 } else {
hp=hp-1; //hpが1減る $score=$score+1; //Scoreに10ポイント加算 t.die(); //弾を消す if (hp<1) die(); //hpが1未満の場合はdie()を呼ぶ } } } } --------------------------------------------------------------- --------------------------------------------------------------- teki1.tonyu --------------------------------------------------------------- extends teki;
while (y<$screenHeight) {
y+=1;
atariHantei();
update();
} --------------------------------------------------------------- --------------------------------------------------------------- teki2.tonyu --------------------------------------------------------------- extends teki;
while (y<$screenHeight) {
y+=1; if (x<$myChar.x) x+=1; else x-=1;
atariHantei();
update();
} ---------------------------------------------------------------

 
      

このようにすることで、Programを見やすく、後の変更も容易になります。処理速度は遅くなるようなことはありません。また、クラスの継承はteki3、teki4などクラスの数が増えてきた時にその威力を発揮します

 

発展・・・(最上級者のみ)

 オーバーライドとは、Super Classで定義したメソッドをSub Classで再定義することです。この場合、Super Classのメソッドを参照したい場合には

 super.MethodName(Args,...);

のようにして使用してください。static関数ではありませんが静的束縛の隠蔽を行う事が可能です。動的束縛は起りません。実際には使う必要性はあまり生じないと思います。