Как я могу написать пользовательский ввод на основе конструктора? - PullRequest
0 голосов
/ 25 октября 2018

Я хочу иметь несколько классов и хочу создать один на основе пользовательского ввода.В частности, я пишу текстовое приключение и у меня есть класс для каждого типа «класса игрока», которым может быть игрок.Мои три класса расширяют родительский класс "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 ]

0 голосов
/ 25 октября 2018

Я предполагаю, что родительский класс трех подклассов называется 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;
    }
0 голосов
/ 25 октября 2018

В зависимости от различий между классами, это можно сделать только с одним 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;
        }

ПРИМЕЧАНИЕ. Это уменьшает количество классов, которые вы должны создать, однако это уместно, только если различия между классами просто разныеначальная статистика.Если разные классы на самом деле имеют разные методы, тогда потребуется наследование.

0 голосов
/ 25 октября 2018

Может быть что-то вроде этого

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...