2017-01-19 89 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

相關問題