簡體   English   中英

如何將子類轉換為超類 [無法轉換]?

[英]How to cast a subclass to a superclass [cannot convert]?

我有一個名為 Hero 的通用類和三個擴展它的子類:Mage、Warrior、Ranger。 英雄類有健康和力量,每個子類都有額外的屬性。

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) object;”。 所以我很困惑為什么我的英雄戰士不能被施展到英雄對象上。

這里:

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

我相信你下面所說的是一種誤解:

...我想創建該英雄類並將其轉換為英雄,這樣它也將具有英雄屬性和方法。

子類始終具有其超類的屬性。 所以在這種情況下,如果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 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM