2017-01-19 86 views
1

我有一个叫做英雄的普通班级和三个扩展它的子类:法师,战士,游侠。英雄类有健康和力量,每个子类都有其他属性。如何将子类转换为超类[无法转换]?

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 =(整数)对象;”。所以我很困惑,为什么我的英雄战士不能被铸造成英雄对象。

+0

类'战士'应该延伸'这里' –

+0

把这个类的代码:'法师','战士','游侠' –

+1

*“我的勇士是英雄不能铸造到英雄对象”*你没有战士,你有一个任意的英雄实例,你不能也不应该尝试执行一个沮丧。如果你不想成为一名战士,那么创建一个,而不是创建一个英雄的实例并投射。 – Tom

回答

1

这里:

Hero hero1 = new Hero(100,10);

您是说hero1Hero

这里:

Warrior h1 = (Hero)hero1

你想说hero1Warrior,但它的不。这是一个Hero

下面是关键:所有Warrior实例都是Hero情况下,但不是所有的Hero实例是Warrior

为了将hero1转换为Warrior,必须将其创建为Warrior。例如

Hero hero1 = new Warrior(100,10);

0

我相信你说下面是一个误解:

...我想创建一个英雄职业,并投它作为一个英雄,因此将有 英雄的属性和方法以及。

子类总是具有其超类的属性。因此,在这种情况下,如果WarriorHero的子类,那么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

相关问题