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 + "ができました.");
}
}