【问题标题】:Java Calling ConstructorJava 调用构造函数
【发布时间】:2017-05-08 16:03:57
【问题描述】:

我创建了一个测试项目,但遇到了一些我想不通的问题。

我正在尝试在 FightManager 中调用 Monster。我希望怪物的变量(namehealthdamagedefense)等于随机的怪物(WolfMonsterGoblinMonster

以前我只有一个怪物,我设法做到了,但现在当有 2 个怪物时,如果选择了不同的怪物,我如何为变量传递不同的值?

public class Units {
    int health;
    int damage;
    int defense;
    String name;

    public boolean isAlive(){
        if(health >= 1){
            return true;
        }else{
            return false;
        }
    }
}

public class Monster extends Units{
    public Monster(String name,int health,int damage,int defense){
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
}

public class GoblinMonster extends Monster {
    public GoblinMonster(String name, int health, int damage, int defense) {
        super("Goblin",50,5,6);
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
}

public class WolfMonster extends Monster {
    public WolfMonster(String name, int health, int damage, int defense) {
        super("Wolf",50,5,6);
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
}

public class FightManager {

    GameManager manage = new GameManager();
    Player player = new Player("Player",100,10,5);
    GoblinMonster gobli = new GoblinMonster("Goblin", 40, 7, 4);
    WolfMonster wolf = new WolfMonster("Wolf",50,9,6);

    boolean myTurn = true;
    ....

我想知道如何根据生成的怪物来分配怪物的值。

【问题讨论】:

  • 不清楚你在问什么。你能具体说明一下你的价值是什么意思吗?
  • 我认为这里不需要两个子类。它们具有完全相同的字段和相同的行为(没有被覆盖的方法)。此外,您的构造函数没有任何意义。您将每个字段初始化两次:一次在基构造函数中,另一次在子类构造函数中。你从子类构造函数中传递了一个硬编码的名称,但在之后立即用传递的名称覆盖它。
  • 不确定是什么问题。看来你对polymorphic behaviors感到困惑。
  • 您当前的代码确实需要继承。您所有的“特殊”单位仅在属性上有所不同。但是应该使用继承来提供不同的行为,这意味着:方法具有相同的名称但不同的内容

标签: java constructor call


【解决方案1】:

我认为这里不需要多个子类和父 Units 类。您可以简单地创建名称为 WolfMonster、GoblinMonster 的不同怪物对​​象。

public class Monster {
    int health;
    int damage;
    int defense;
    String name;

    Monster(String name, int health, int damage, int defense)
    {
        this.name = name;
        this.health = health;
        this.damage = damage;
        this.defense = defense;
    }
    public boolean isAlive()
    {
        if(health >= 1){
            return true;
        }else{
            return false;
        }
    }    
}

public class FightManager {

    GameManager manage = new GameManager();
    Player player = new Player("Player",100,10,5);

    //changes

    Monster gobli = new Monster("Goblin", 40, 7, 4);
    Monster wolf = new Monster("Wolf",50,9,6);

    boolean myTurn = true;

    // To-Do
}

【讨论】:

  • 是的,我想到了,但是以后我计划添加越来越多的怪物,我认为使用这种方法会矫枉过正
  • 你可以通过调用 new Monster("SomeName", 40, 7, 4); 来使用更多的 Monster;
【解决方案2】:

也许您想要做的是在每个构造函数中将“名称”设置为常量。

因此,例如 WolfMonster 将是:

public class WolfMonster extends Monster {
    public static String TYPE = "Wolf";
    public WolfMonster(int health, int damage, int defense) {
        super(WolfMonster.TYPE,health,damage,defense);
    }
}

请注意,您不需要重新签名成员字段,因为将在调用 super() 时分配。

【讨论】:

    【解决方案3】:

    为此,您必须使用多态性,通过将 Unit 类声明为接口。方法 isAlive() 作为抽象以及属性。另一方面,Monster 类应该实现 Unit 接口,其余部分你的怪物类将扩展怪物类。最后,您将在每个子类中覆盖方法 isAlive(),然后瞧!

    【讨论】:

    • 你救了我兄弟!谢谢我一直在寻找的答案
    猜你喜欢
    • 2017-07-28
    • 2018-02-28
    • 2015-07-02
    • 1970-01-01
    • 2014-02-04
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多