2017-01-19 5 views
1

У меня есть общий класс под названием Hero и три подкласса, который расширяет его: Mage, Warrior, Ranger. Класс Hero имеет здоровье и силу, и каждый подкласс имеет дополнительные атрибуты.Как отнести подкласс к суперклассу [невозможно преобразовать]?

public class Warrior extends Hero { 
private int armor; 

public Warrior(int health, int strength, int armor) { 
    super(health,strength); 
    this.armor = armor; 
} 

} 


public class Hero { 
private int health; 
private int strength; 

public Hero(int health, int strength) { 
    this.health = health; 
    this.strength = strength; 

} 

//Getters 
public int getHealth() { 
    return health; 
} 
public int strength() { 
    return strength; 
} 
//Setters 
public void takeDamage(Hero player, int n) { 
    player.health = player.health-n; 
} 
public void healDamage(Hero player, int n) { 
    player.health = player.health+n; 
} 

}

И в главном классе я пытаюсь сделать два объекта героя, и когда пользователь выбирает, какой класс они хотят быть, я хочу, чтобы создать этот класс героя и бросьте его как героя, так он будет иметь атрибуты и методы героя.

public static void main(String[] args) { 

    Hero hero1 = new Hero(100,10); 
    Hero hero2 = new Hero(100,10); 
    //Players select the class 
    Scanner scanner = new Scanner(System.in); 
    System.out.println("Player select a class: Warrior, Mage, Ranger "); 
    String p = scanner.next(); 
    switch (p) { 
    case "Warrior": Warrior h1 = (Hero)hero1; //this doesn't work 
     break; 
    case "Mage": 
     break; 
    case "Ranger": 
     break; 
    } 




} 

Я посмотрел вокруг, и я отчасти понимаю, в качестве примера, как объект может быть целым числом, и вы можете сделать «INT I = (Integer) объект;». Поэтому я смущен, почему мой воин, который является героем, не может быть брошен в объект героя.

+0

Класс 'Warrior' должен расшириться 'Here' –

+0

введите код этого класса:' Mage', 'Warrior',' Ranger' –

+1

* «мой воин, который не может быть героем, не попадает в объект героя» * You у вас нет воина, у вас есть произвольный экземпляр героя, и вы не можете и не должны пытаться выполнить подавление. Если вы не воин, тогда создайте его, а не создайте экземпляр героя и бросьте его. – Tom

ответ

1

Здесь:

Hero hero1 = new Hero(100,10);

Вы говорите, что hero1 является Hero

Здесь:

Warrior h1 = (Hero)hero1

вы пытаетесь сказать hero1 является Warrior, но это не. Это Hero.

Следующий является ключевым: Все Warrior экземпляров Hero случаев, но не все Hero экземпляров в Warrior.

Для того, чтобы отличить hero1 с номером Warrior, он должен быть создан как Warrior. например

Hero hero1 = new Warrior(100,10);

0

Я верю, что вы сказали ниже, является ошибочным:

... Я хочу, чтобы создать этот класс героя и бросьте его как героя, так что будет иметь атрибуты героя и методы также.

Подклассы всегда имеют свойства своего суперкласса. Поэтому в этом случае, если Warrior является подклассом Hero, тогда Warrior будет иметь все свойства и методы, которые Hero имеет, поэтому вам не нужно «бросать подкласс в суперкласс». Такой потребности никогда не бывает.

В данном конкретном примере, что вы можете писать либо это

Hero hero1 = new Hero(100 /* health */,10 /* strength */); 
. . . 
case "Warrior": 
    Hero h1 = hero1; 
    break; 

Или это

Hero warrior1 = new Warrior(100 /* health */ 
          ,10 /* strength */ 
          ,20 /* armor */); 
. . . 
case "Warrior": 
    Hero h1 = warrior1 ; 
    break; 

Или даже это

Warrior warrior1 = new Warrior(100 /* health */ 
           ,10 /* strength */ 
           ,20 /* armor */); 
. . . 
case "Warrior": 
    Hero h1 = warrior1 ; 
    break; 

Какой из них больше подходит? Это зависит от вашей конкретной ситуации (т. Е. Вы действительно хотите, чтобы объект был Hero или Warrior).

+0

* «Какой из них более уместен?» * Ни один из них, поскольку все они используют локальные переменные с довольно ограниченной областью. – Tom

Смежные вопросы