【问题标题】:Java composition constructorJava 组合构造函数
【发布时间】:2015-10-24 18:34:06
【问题描述】:

我创建了一些基本的 rpg。我使用合成(角色和战士)并且 CharacterCreator 类中存在问题。它说存在不兼容的类型,Game.Fighter(以及我创建的其他角色类)和 Game.Character。知道为什么以及如何解决这个问题吗?

public class Game {
public static void main(String[] args) throws IOException {

    Character hero = CharacterCreator.createCharacter();

    try {
        hero.displayCharacter();
    }catch (Exception e){
        System.out.println("Wrong");
    }


}

}

public class CharacterCreator {

public static Character createCharacter() {
    System.out.println("Choose a character: ");
    System.out.println("1. Fighter");
    System.out.println("2. Rogue");
    System.out.println("3. Mage");
    System.out.println("4. Cleric");


    Scanner sc = new Scanner(System.in);
    int scan = sc.nextInt();
    String chosenClass = getCharacterClass(scan);

    System.out.println("Choose Name:");
    Scanner nameIn = new Scanner(System.in);
    String name = nameIn.next();

    Character hero = null;

    switch (chosenClass){
        case "Fighter":
            hero = new Fighter(name);
            break;
        case "Rogue":
            hero = new Rogue(name);
            break;
        case "Mage":
            hero = new Mage(name);
            break;
        case "Cleric":
            new Cleric(name);
            break;
        case "def":
            System.out.println("Wrong input");
    }

    return hero;
}


public static String getCharacterClass(int scan){

    String classIn;

    switch (scan) {
        case 1:
            classIn = "Fighter";
            break;
        case 2:
            classIn = "Rogue";
            break;
        case 3:
            classIn = "Mage";
            break;
        case 4:
            classIn = "Cleric";
            break;
        default:
            System.out.println("Enter again");
            classIn = "def";
    }

    return classIn;
}

}

public class Character {

private String name;
private String characterClass;
private int level;
private int hp;
private int currentHp;
private int armorClass;

private long xp;
/*private int BAB; /*Base attack bonus*/

private int strength;
private int constitution;
private int dexterity;
private int intelligence;
private int wisdom;
private int charisma;


protected Character(String name){

    setName(name);
    setCharacterClass("Class");
    setLevel(1);
    setStrength(10);
    setConstitution(10);
    setDexterity(10);
    setIntelligence(10);
    setWisdom(10);
    setCharisma(10);
    setHp(0);
    setCurrentHp(getHp());
    setArmorClass(10);
    setXp(0);

}


void displayCharacter() throws IOException {
    System.out.print("\n\n\n");
    System.out.println("Name: " + getName());
    System.out.println("Class: " + getCharacterClass());
    System.out.println("Level: " + getLevel());
    System.out.println("HP: " + getHp());
    System.out.println("Current HP: " + getCurrentHp());
    System.out.println("Armor Class: " + getArmorClass());

    System.out.println("***************");
    System.out.println("Attributes: ");
    System.out.println("Strength: " + getStrength());
    System.out.println("Constitution: " + getConstitution());
    System.out.println("Dexterity: " + getDexterity());
    System.out.println("Intelligence: " + getIntelligence());
    System.out.println("Wisdom: " + getWisdom());
    System.out.println("Charisma: " + getCharisma());
    System.out.println("***************");
    System.out.println("XP: " + getXp());

}

public int getModifier(int number){
    int mod = (int)((number -10)/2);
    return mod;
}

public String getName() { return name; }
public String getCharacterClass() { return characterClass; }
public int getLevel() { return level; }
public int getHp() { return  hp; }
public int getCurrentHp() { return  currentHp; }
public int getArmorClass() { return  armorClass; }
public int getStrength(){ return strength; }
public int getConstitution(){ return constitution; }
public int getDexterity(){ return dexterity; }
public int getIntelligence(){ return intelligence; }
public int getWisdom(){ return wisdom; }
public int getCharisma(){ return charisma;}
public long getXp(){ return xp;}


protected void setName(String Name) { name = Name; }
protected void setCharacterClass(String characterClass) { this.characterClass = characterClass; }
protected void setLevel(int lvl){ level = lvl; }
protected void setHp(int hitPoints){ hp = hitPoints; }
protected void setCurrentHp(int curHp){ currentHp = curHp; }
protected void setArmorClass(int ac){ armorClass = ac; }
protected void setStrength(int str){ strength = str; }
protected void setConstitution(int con){ constitution = con; }
protected void setDexterity( int dex) { dexterity = dex; }
protected void setIntelligence(int intel){ intelligence = intel; }
protected void setWisdom(int wis){ wisdom = wis; }
protected void setCharisma(int cha){charisma = cha; }
protected void setXp(int XP){xp = XP; }

}


public class Fighter  {

    Fighter(String name){

        Character hero = new Character(name);

        hero.setName(name);
        hero.setCharacterClass("Fighter");
        hero.setLevel(1);
        hero.setStrength(14);
        hero.setConstitution(16);
        hero.setDexterity(14);
        hero.setIntelligence(10);
        hero.setWisdom(10);
        hero.setCharisma(10);
        hero.setHp((int) (10 + hero.getModifier(hero.getConstitution())));
        hero.setHp(10);
        System.out.println("hero.getconst(): " + hero.getConstitution());
        System.out.println("hero.getModifier(getConstitution(): " + hero.getModifier(hero.getConstitution()));
        hero.setCurrentHp(hero.getHp());
        hero.setArmorClass(10 + hero.getModifier(hero.getDexterity()));


}


}

【问题讨论】:

  • 您没有发布准确完整的错误消息,这是最重要的信息。你还应该尽快做的是将Character重命名为别的东西:它与java.lang.Character冲突,这会给你带来无尽的痛苦。
  • java:不兼容的类型:Game.Fighter 无法转换为 Game.Character
  • 错误的代码行是?
  • Edit 你的问题(点击我的链接或上面的“编辑”链接)并按照 JBNizet 所说的完整堆栈跟踪发布。

标签: java constructor composition


【解决方案1】:

Figter 类被声明为

public class Fighter {

所以它确实从 Character 类扩展而来。所以战士不是角色。

然而CharacterCreator 类有以下方法:

public static Character createCharacter() {
    // ...
    switch (chosenClass){
        case "Fighter":
            hero = new Fighter(name);
            break;
            // ...
    }

    return hero;
}

因此,您尝试从必须返回角色的方法中返回 Fighter。战士不是角色。因此出现错误消息。

【讨论】:

  • 我明白你的意思。它应该是一个组合,而不是继承。那我该如何解决呢?
  • 组合包括两个类之间的“具有”关联。所以我猜你希望 Charater 有一个 Fighter 类型的字段,并有一个构造函数,比如 new Character(someFighter)。但考虑到名称,这似乎根本不对。我什至不明白你为什么有一个 Fighter 类:它没有任何字段,也没有任何方法。它所拥有的只是一个创建角色的构造函数。没用。
  • 我想获得一个角色类别(如战士)作为输入,并根据所选角色类别(如战士)创建一个具有预定统计/能力的角色。一个字符有一个字符类,而不是一个字符类是一个字符,当然。正如你所说,构造函数应该看起来像 Character("Fighter)。有什么建议吗?
【解决方案2】:

我想获得一个角色类(如战士)作为输入,并根据所选角色类(如战士)创建一个具有预定统计/能力的角色。

在 Character 中创建一个静态 fighter creator 方法(以访问受保护的 setXxxx() 方法),创建一个新 Character 实例,并覆盖所需的统计信息。

class Character {
    public static Character createFighter(String name) {
        Character hero = new Character(name);
        hero.setStrength(14);
        hero.setCharacterClass("Fighter");
        hero.setStrength(14);
        hero.setConstitution(16);
        hero.setDexterity(14);
        hero.setHp((int) (10 + hero.getModifier(hero.getConstitution())));
        hero.setCurrentHp(hero.getHp());
        hero.setArmorClass(10 + hero.getModifier(hero.getDexterity()));

        return hero;
    }
}

或者,将字符类传递给 Character 构造函数:

class Character {
    public Character(String name, String charClass) {
        // Initialize defaults
        setStrength(10);
        setIntelligence(10);
        // etc

        switch(charClass) {
        case "Fighter":
           setStrength(14);
           // ... other overrides for Fighter
           break;
        case "Cleric":
           // etc
        }
    }
}

但是,如果您要对字符类进行多次检查,则应该使用枚举。然后您甚至可以将初始统计信息放入枚举类中。请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html,尤其是 Planet 示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多