
参考書にsuperについての記述があったのですが、よく使い道が分からないので、教えてください。
Heroクラスとそれを継承し、空を飛べるようになったSuperHeroクラスがあったとします。
public class Hero { String name = "タロウ"; int hp = 100; public void attack(slime a) { System.out.println(this.name + "の攻撃"); a.hp -= 5; System.out.println("5ポイントのダメージを与えた"); } public void run() { System.out.println(this.name + "は逃げだした"); } }
public class SuperHero extends Hero{ boolean flying; public void fly() { this.flying = true; System.out.println("飛び上がった"); } public void land() { this.flying = false; System.out.println("着地した"); } public void run() { System.out.println("撤退した"); } }
public class Main { public static void main(String[] args) { Hero h = new Hero(); SuperHero sh = new SuperHero(); Slime a = new Slime(); } }
そこで、SuperHeroは空を飛んでいる状態でattack()すると2回連続攻撃できるよう変更したとします。
public class SuperHero extends Hero{ boolean flying; public void fly() { this.flying = true; System.out.println("飛び上がった"); } public void land() { this.flying = false; System.out.println("着地した"); } public void run() { System.out.println("撤退した"); } public void attack(Slime a) { System.out.println(this.name + "の攻撃"); a.hp -=5; System.out.println("5ポイントのダメージを与えた"); if(this.flying) { System.out.println(this.name + "の攻撃"); a.hp -=5; System.out.println("5ポイントのダメージを与えた"); } } }
しかしこの方法では、将来Heroクラスのattackメソッドの一回の攻撃ダメージが10に変更されたとき、fly()を呼び出した後、attack()を呼び出してもSuperHeroクラスでオーバーライドしているため、ダメージのポイントが5ポイントのままになってしまいます。
それを回避するために、superを使い、以下の記述で実現することが出来るようになります。
public class SuperHero extends Hero { public void attack (slime a) { super.attack(a); if(this.flying) { super.attack(a); } } 、 、 、 }
自分の参考書にはsuperの使い方としてこういう記述があったんですが、イマイチsuoerの有用性が理解できません。
そもそも外部クラスからメソッドを呼び出すとき、インスタンスを指定しますよね?例えばrun()ならh.run()とかsh,run()とか。
superの説明の導入として、スーパークラスから継承されたサブクラスは、スーパークラスのフィールドやメソッドを含んでおり、云わば二重構造の様になっているので、例えばスーパークラスとサブクラスで同じメソッドがあった時、外部からそのメソッドの呼び出しがかかると、多重構造インスタンスは極力外側(サブクラス)のインスタンスのメソッドが優先される。だったらスーパークラスの同一メソッドの必要性はあるのかという導入からsuperの話が始まったんですが、スーパークラスのメソッドを使いたいならスーパークラスのインスタンスを指定して呼び出せばよくないですか?この場合h.attack()と。わざわざ、サブクラスにsuperを記述してそれを経由する意味が分からないんですが。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。