P440
自分で打った分はエラーがいっぱい
--->PoisonMattango.java
package exercise;
public class PoisonMatango extends Matango{//マタンゴを継承
int poisonCount = 5;
//ポイズンマタンゴが呼び出されたらどうします
public PoisonMatango(char name) {
super(name);
}
public void attack(Hero h) {
super.attack(h);
if (poisonCount >0) {
System.out.println("さらにどくの胞子をばらまいた");
int hoge = Hero.hp/5;
Hero.hp -= hoge;
System.out.println(hoge+"のダメージ");
poisonCount -= 1;
}
}
}
修正と解説
①まずHero.hpじゃなくてh.getHp();
かつ、
②HeroのhpのセッタゲッタがおりませんのでHero.javaの方で生成
③hpを引くときも、「変数から引く」でなく、セットゲットの概念で扱うように!
④hのsetHpに値をセットするという考えで行く。セットするのはhのgetHpからダメージであるhogeを引いた分
⑤教科書ではhogeじゃなくてdmgとなっているがこの方がわかりやすいかもね
⑥「値を1引く」の構文はpoisonCount --;
かつ、
⑦おそらく毒マタンゴが何人もいるかもだからだろう、毒使用回数を引くのは「this.poisonCount--;」
修正後
--->PoisonMatango.java
package exercise;
public class PoisonMatango extends Matango{//マタンゴを継承
int poisonCount = 5;
//ポイズンマタンゴが呼び出されたらどうします
public PoisonMatango(char name) {
super(name);
}
public void attack(Hero h) {
super.attack(h);
if (poisonCount >0) {
System.out.println("さらにどくの胞子をばらまいた");
int hoge = h.getHp()/5;
h.setHp(h.getHp()-hoge);
System.out.println(hoge+"のダメージ");
this.poisonCount --;
}
}
}
--->Hero.java
package exercise;
public class Hero {
static int hp;
//getter/setterの自動生成
public static int getHp() {
return hp;
}
public static void setHp(int hp) {
Hero.hp = hp;
}
}
12章をまとめてA4 1枚
12章自分の名前 ドライブに提出
12章まとめ 継承について
前置き
継承は便利! 先祖の資産(既存クラス)をじゃんじゃん使える。しかし困ったこともあるのだ。
開発者は二つの立場を取り得る。
立場1:いま必要な子クラスを作る開発者
立場2:のちのち、継承されて便利に使われるであろう親クラスとなりうるクラスを作っておく開発者
いままでは立場1だけで作ってきたが、継承を学んだ今、立場2でもできるように。未来に備える開発者になりましょう。たとえば「Character」クラスを作っておき、HeroやWizardたちが使えるname,hpやattack();run()などをもたせておくとか。
しかし、立場2で考え出すとわかるのだが、親クラスとなりうるクラスを作ろうとしても、その時点で子供がどうなるかわからない。たとえば与ダメージがいくつになるかはキャラクタによって変わるし、二回攻撃できるやつがいるかも。現在非実装のキャラのattackメソッドは確定しようがない。
→詳細未定メソッドの存在
詳細未定メソッドをどう解決するか?
①attackメソッドをcharacterから削除
・しかし、前提として「すべてのキャラはhpをもち攻撃ができる」というものがある
・開発するみなさんが、それぞれのキャラに忘れずにattack()を付けてくれればいいが、にんげんは忘れっぽいしミスもする
②オーバーライドがあるじゃないか
・親クラスであるcharacterでは、atttack()メソッドは用意しよう。ただし中身は空。
・HeroやWizardやそのほかのみなさんのメソッドで、attack()をふさわしいようにオーバーライドしてもらおう。
・しかし、にんげんは忘れやすい。オーバーライドも忘れるかも。ミススペルするかも。うにゃうにゃとコメントを書いてもみなさん読まないだろう。
・中身がからだと「ああ何もしないためのメソッド」と思い込み、オーバーライド前提ということが伝わらない可能性もある。
③子クラスを生成する前提でこしらえたcharacterを、newしてしまう面白い人が出現してしまうかもしれない
・コメントをうにゃうにゃ書いても(以下略)
抽象クラス
これらの問題を解決するのが抽象クラスと呼ばれるもの。
・「attack()メソッドを宣言する必要があるのでしますが、中身が未確定なんで、からです。そういう意味です。」
こういうのを抽象メソッドという
・abstractというのを使う
・newしていけないのもこれを使う
そうすると、newによるインスタンス化が禁止に
・あるメソッドを抽象メソッドにしておくと未来の開発者にオーバーライドを強制もできる
インターフェース
なお、特に抽象度が高いクラスをインターフェースという
条件は2つ
・すべてのメソッドが抽象メソッド
・フィールドをもたない
そして、多重継承ができるようになるというおまけつき。