package Kabu; public class TheGiantTurnip { public static void main(String[] args) { System.out.println("「おおきなかぶ」~ロシア民話~"); Human jisan = new Human("おじいさん", 40); Turnip kabu = jisan.plant(); jisan.grab(kabu); jisan.pull(); Human basan = new Human("おばあさん", 20); jisan.call(basan); // お爺さんがお婆さんを呼んでくる(お婆さんはお爺さんを掴む) basan.pull(); // お婆さんが引っ張る Human mago = new Human("まご", 10); basan.call(mago); mago.pull(); Dog inu = new Dog(15); mago.call(inu); inu.pull(); Cat neko = new Cat(10); inu.call(neko); neko.pull(); Mouse nezumi = new Mouse(5); neko.call(nezumi); nezumi.pull(); } } abstract class Organism { String name = ""; int power; abstract void pull(int receivedPower); String getName() { return name; } } class Animal extends Organism { Organism grabbingObject; Turnip plant() { System.out.println(name + "はカブを植えました."); return new Turnip(); } void call(Animal dareka) { System.out.println(name + "は" + dareka.getName() + "を呼んできました."); // dareka.grabbingObject = this; dareka.grab(this); } void grab(Organism _grabbingObject) { grabbingObject = _grabbingObject; } void pull() { /* 末尾の生き物が引っ張るときに呼び出す */ if (grabbingObject == null) { System.out.println("何も掴んでいません"); return; } if (grabbingObject instanceof Vegetable) { System.out.println(name + "は" + grabbingObject.getName() + "を引っ張りました."); } else { System.out.println(name + "は" + grabbingObject.getName() + "を引っ張り,"); } grabbingObject.pull(power); // 末尾の生き物が、掴んでいるモノを、powerの力で引っ張る } void pull(int receivedPower) { /* メソッドのオーバーロード */ // 生き物がpowerで引っ張るとき if (grabbingObject == null) { System.out.println("何も掴んでいません"); return; } if (grabbingObject instanceof Vegetable) { // 引っ張り対象が野菜(カブ)だったら、おわり System.out.println(name + "は" + grabbingObject.getName() + "を引っ張りました."); } else { System.out.println(name + "は" + grabbingObject.getName() + "を引っ張り,"); } grabbingObject.pull(power + receivedPower); // 再帰呼び出し } } class Human extends Animal { Human(String _name, int _power) { name = _name; power = _power; } } class Dog extends Animal { Dog(int _power) { name = "犬"; power = _power; } } class Cat extends Animal { Cat(int _power) { name = "猫"; power = _power; } } class Mouse extends Animal { Mouse(int _power) { name = "ねずみ"; power = _power; } } class Vegetable extends Organism { boolean harvest = false; @Override void pull(int receivedPower) { // カブのとき(サブクラスでのオーバーライド) System.out.println("うんとこしょ,どっこいしょ"); if (power <= receivedPower) { System.out.println(name + "は抜けました.(条件:" + power + "以上,現在:" + receivedPower + ")"); harvest = true; } else { System.out.println("しかし" + name + "は抜けません.(条件:" + power + "以上,現在:" + receivedPower + ")"); System.out.println(); } } } class Turnip extends Vegetable { Turnip() { name = "カブ"; power = 100; System.out.println("大きな" + name + "ができました."); } }