Как я могу написать пользовательский ввод на основе конструктора?
Я хочу иметь несколько классов и хочу создать один на основе пользовательского ввода. В частности, я пишу текстовое приключение и у меня есть класс для каждого типа "класса игрока", которым может быть игрок. Мои три класса расширяют родительский класс "stats".
Вот часть моего кода: (я использую конструктор печати для эффективности записи)
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);
3 ответа
Я предполагаю, что родительский класс трех подклассов называется MainCharacter
,
Первый, mainCharacter
должен быть типа MainCharacter
, если вы не готовы сделать instanceof
проверяет и бросает каждый раз, когда вы хотите использовать mainCharacter
, Каждое действие, которое вам нужно сделать на mainCharacter
нужно будет определить в MainCharacter
не в подклассах.
Во-вторых, вам нужно объявить mainCharacter
за пределами switch
, а затем определить его в 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;
}
Может быть что-то вроде этого
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);
}
}
В зависимости от различий между классами, это может быть сделано только с одним MainCharacter class
и разные фабричные методы для каждого класса.
Например, настроить класс MainCharacter следующим образом:
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;
}
ПРИМЕЧАНИЕ. Это уменьшает количество классов, которые вы должны создать, однако это уместно только в том случае, если различия между классами представляют собой просто разные начальные характеристики. Если разные классы на самом деле имеют разные методы, тогда наследование будет необходимо.