首先,对不起,如果我没有使用关于制作课程副本的正确的话,我是Java的新手。
System.out.println("Choose a class:\nWarrior\nRouge\nCleric\nWizard\nArcher");
String playerClass = input.nextLine();
if (playerClass.equalsIgnoreCase("Warrior")){
playerClass = "warrior";
Character player = new Warrior();
}
if (playerClass.equalsIgnoreCase("Rouge")){
playerClass = "rouge";
Character player = new Rouge();
}
if (playerClass.equalsIgnoreCase("Cleric")){
playerClass = "cleric";
Character player = new Cleric();
}
if (playerClass.equalsIgnoreCase("Wizard")){
playerClass = "wizard";
Character player = new Wizard();
}
if (playerClass.equalsIgnoreCase("Archer")){
playerClass = "archer";
Character player = new Archer();
}
以上代码是我出现问题的地方。我正在创建一个旧式的文本冒险游戏,我有一个名为Character
的类。它的子类是玩家可以选择的类(向导,战士,胭脂等)。我知道在if语句之外无法访问if语句中声明的类(再次,不确定我是否使用正确的单词),但如果我没有在if语句中声明它,那么编译器将不会知道该类使用什么子类。
有没有办法在if语句之外访问类,或者在if
语句之外声明类,然后在if语句中更改子类?
答案 0 :(得分:4)
只需将您的变量声明在 if
语句之外,然后将分配到 if
语句中。这与您对playerClass
变量的使用情况相同
像这样:
String playerClass = input.nextLine();
Character player = null;
if (playerClass.equalsIgnoreCase("Warrior")){
playerClass = "warrior";
player = new Warrior();
}
if (playerClass.equalsIgnoreCase("Rouge")){
playerClass = "rouge";
player = new Rouge();
}
这假设Warrior
,Rouge
,ets都是Character
的子类。
答案 1 :(得分:2)
您不创建自己创建的对象副本 instances
。 copy
的语义是创建一个完全独立但相同的instance
预先存在的instance
。由于术语clone
的语义,这在Java中也被称为clone
。
final Character character; // assuming that all the instances subclass `Character`
if ("warrior".equalsIgnoresCase(playerClass)) { character= new Warrior(); }
else if ("cleric".equalsIgnoresCase(playerClass)) { character = new Cleric(); }
else if ( /* you get the idea */ ) { character= new Whatever();}
else() { throw new RuntimeException(playerClass + " is not a valid class"); }
学习使用final
正确对于编写易于维护的确定性代码至关重要。
重要的是,所有if/else if/else
都是排他性的,因此没有您错过的边缘情况。 character
null
永远不可能使用此代码正确初始化。
将"SomeString".equalsIgnoreCase(variable);
字面值与变量进行比较的成语String
确保你永远不必测试null
并且不会得到{{1}在比较期间,因为NullPointerException
测试已在方法内部。
这也避免了null
的使用,这几乎是不合适的,并导致大量的防御性编程和难以维护的代码。您要么创建一个有效的实例,要么失败,并且您确切地知道它失败的原因。
让名为null
的{{1}}实例令人困惑。
Character
This is just one of many Creational Patterns available to you.