我如何编写基于用户输入的构造函数?
how can i write a user input based constructor?
我想要多个 classes 并且想根据用户输入构建一个。
具体来说,我正在写一个文字冒险,并为玩家可以成为的每种 "player class" 类型设置 class。我的三个 classes 扩展了一个父 "stats" class。
这是我的部分代码:
(为了提高写作效率,我使用了打印构造函数)
switch (answer) {
case 1:
{
adv.print("you are a mage");
mainCharacterMage mainCharacter = new mainCharacterMage();
break;
}
case 2:
{
adv.print("you are an assasin");
mainCharacterAssasin mainCharacter = new mainCharacterAssasin();
break;
}
case 3:
{
adv.print("you are a fighter");
mainCharacterFighter mainCharacter = new mainCharacterFighter();
break;
}
default:
adv.print("error wrong answer");
break;
}
String printThis = Integer.toString(mainCharacter.getHealth());
adv.print("your health is "+printThis);
可能是这样的
public interface Character {
// here is all common method of your Character
}
public class CharacterFactory {
private class CharacterMage implements Character {
// here is implementation
}
private class CharacterAssasin implements Character {
// here is implementation
}
public Character createCharacter(String characterName) {
switch (characterName) {
case "Mage":
return new CharacterMage();
case "Assasin":
return new CharacterAssasin();
default:
throw new IllegalArgumentException("Incorrect character type " + characterName);
}
}
我假设三个子 class 的父 class 称为 MainCharacter
。
首先,mainCharacter
必须是 MainCharacter
类型,除非您愿意在每次要使用 mainCharacter
时都进行 instanceof
检查和转换。您需要在 mainCharacter
上执行的每个操作都需要在 MainCharacter
中定义,而不是在子 class 中定义。
其次,你需要在switch
之外声明mainCharacter
,然后在switch
中定义它:
MainCharacter mainCharacter; // Declare it outside
switch (answer) {
case 1:
{
adv.print("you are a mage");
mainCharacter = new MainCharacterMage(); // Then define it on the inside
break;
}
case 2:
{
adv.print("you are an assasin");
mainCharacter = new MainCharacterAssasin();
break;
}
case 3:
{
adv.print("you are a fighter");
mainCharacter = new MainCharacterFighter();
break;
}
default:
adv.print("error wrong answer");
break;
}
根据 classes 之间的差异,这可以只用一个 MainCharacter class
和不同的 factory 方法 来完成每个 class.
例如像这样设置 MainCharacter class:
public class MainCharacter{
public int health;
public int damage;
// etc.
public static MainCharacter buildMage(){
health = 5;
damage = 20;
// etc.
}
public static MainCharacter buildAssassin(){
health = 10;
damage = 10;
// etc.
}
public static MainCharacter buildMage(){
health = 20;
damage = 5;
// etc.
}
}
然后像这样创建 MainCharacter:
switch (answer) {
case 1:
{
adv.print("you are a mage");
MainCharacter main_character = MainCharacter.buildMage();
break;
}
case 2:
{
adv.print("you are an assasin");
MainCharacter main_character = MainCharacter.buildAssassin();
break;
}
case 3:
{
adv.print("you are a fighter");
MainCharacter main_character = MainCharacter.buildFighter();
break;
}
注意:这减少了您必须创建的 classes 的数量,但是只有当 classes 之间的差异只是不同的初始统计数据时才适用。如果不同的 classes 实际上有本质上不同的方法,那么就需要继承。
我想要多个 classes 并且想根据用户输入构建一个。 具体来说,我正在写一个文字冒险,并为玩家可以成为的每种 "player class" 类型设置 class。我的三个 classes 扩展了一个父 "stats" class。
这是我的部分代码: (为了提高写作效率,我使用了打印构造函数)
switch (answer) {
case 1:
{
adv.print("you are a mage");
mainCharacterMage mainCharacter = new mainCharacterMage();
break;
}
case 2:
{
adv.print("you are an assasin");
mainCharacterAssasin mainCharacter = new mainCharacterAssasin();
break;
}
case 3:
{
adv.print("you are a fighter");
mainCharacterFighter mainCharacter = new mainCharacterFighter();
break;
}
default:
adv.print("error wrong answer");
break;
}
String printThis = Integer.toString(mainCharacter.getHealth());
adv.print("your health is "+printThis);
可能是这样的
public interface Character {
// here is all common method of your Character
}
public class CharacterFactory {
private class CharacterMage implements Character {
// here is implementation
}
private class CharacterAssasin implements Character {
// here is implementation
}
public Character createCharacter(String characterName) {
switch (characterName) {
case "Mage":
return new CharacterMage();
case "Assasin":
return new CharacterAssasin();
default:
throw new IllegalArgumentException("Incorrect character type " + characterName);
}
}
我假设三个子 class 的父 class 称为 MainCharacter
。
首先,mainCharacter
必须是 MainCharacter
类型,除非您愿意在每次要使用 mainCharacter
时都进行 instanceof
检查和转换。您需要在 mainCharacter
上执行的每个操作都需要在 MainCharacter
中定义,而不是在子 class 中定义。
其次,你需要在switch
之外声明mainCharacter
,然后在switch
中定义它:
MainCharacter mainCharacter; // Declare it outside
switch (answer) {
case 1:
{
adv.print("you are a mage");
mainCharacter = new MainCharacterMage(); // Then define it on the inside
break;
}
case 2:
{
adv.print("you are an assasin");
mainCharacter = new MainCharacterAssasin();
break;
}
case 3:
{
adv.print("you are a fighter");
mainCharacter = new MainCharacterFighter();
break;
}
default:
adv.print("error wrong answer");
break;
}
根据 classes 之间的差异,这可以只用一个 MainCharacter class
和不同的 factory 方法 来完成每个 class.
例如像这样设置 MainCharacter class:
public class MainCharacter{
public int health;
public int damage;
// etc.
public static MainCharacter buildMage(){
health = 5;
damage = 20;
// etc.
}
public static MainCharacter buildAssassin(){
health = 10;
damage = 10;
// etc.
}
public static MainCharacter buildMage(){
health = 20;
damage = 5;
// etc.
}
}
然后像这样创建 MainCharacter:
switch (answer) {
case 1:
{
adv.print("you are a mage");
MainCharacter main_character = MainCharacter.buildMage();
break;
}
case 2:
{
adv.print("you are an assasin");
MainCharacter main_character = MainCharacter.buildAssassin();
break;
}
case 3:
{
adv.print("you are a fighter");
MainCharacter main_character = MainCharacter.buildFighter();
break;
}
注意:这减少了您必须创建的 classes 的数量,但是只有当 classes 之间的差异只是不同的初始统计数据时才适用。如果不同的 classes 实际上有本质上不同的方法,那么就需要继承。