首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将子类转换为超类[无法转换]?

如何将子类转换为超类[无法转换]?
EN

Stack Overflow用户
提问于 2017-01-20 05:50:25
回答 2查看 1.9K关注 0票数 1

我有一个叫做英雄的通用类和三个扩展它的子类:法师,勇士,游侠。英雄类有生命力和力量,每个子类都有额外的属性。

代码语言:javascript
复制
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;
}

}

在主类中,我试图创建两个英雄对象,当用户选择他们想要成为的类时,我想创建那个英雄类,并将其转换为英雄,因此它也将具有英雄属性和方法。

代码语言:javascript
复制
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 ) object;“。所以我很困惑,为什么我的英雄战士不能被施展成英雄对象。

EN

回答 2

Stack Overflow用户

发布于 2017-01-20 05:56:51

这里:

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);

票数 1
EN

Stack Overflow用户

发布于 2017-01-20 06:13:13

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

...我想创建那个hero类,并将其转换为hero,这样它也将具有hero属性和方法。

子类总是有它们的超类的属性。因此,在这种情况下,如果WarriorHero的子类,那么Warrior将拥有Hero拥有的所有属性和方法,因此您实际上不需要“将子类转换为超类”。从来没有这样的需要。

在这个特定的示例中,您可能想要编写以下代码

代码语言:javascript
复制
Hero hero1 = new Hero(100 /* health */,10 /* strength */);
. . .
case "Warrior": 
    Hero h1 = hero1; 
    break;

或者这个

代码语言:javascript
复制
Hero warrior1 = new Warrior(100 /* health */
                            ,10 /* strength */
                            ,20 /* armor */);
. . .
case "Warrior": 
    Hero h1 = warrior1 ; 
    break;

或者甚至是这个

代码语言:javascript
复制
Warrior warrior1 = new Warrior(100 /* health */
                               ,10 /* strength */
                               ,20 /* armor */);
. . .
case "Warrior": 
    Hero h1 = warrior1 ; 
    break;

哪一个更合适?这取决于您的实际情况(例如,您真的希望对象是Hero还是Warrior)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41752354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档