2011-06-14 38 views
0

這裏我簡單的類圖鑄造對象,並使用所有覆蓋方法,無需if語句

https://lh5.googleusercontent.com/-2Sgqhmq4o_I/TfeQ2KeJiYI/AAAAAAAAAaw/RhIqPGynYhY/s800/ClassDiagram1.jpg

if (exit.isPressed()) { 
     stop(); 
    } 

    //I want to casting this Sprite depent on their subclass 
    Sprite temp=map.getPlayer(); //This return Sprite object 

    //like this: 
    if(temp instanceof Bisona) 
     Bison player=(Bison) map.getPlayer(); 
    else 
     SuperBison player=(SuperBison) map.getPlayer(); 

    if(message==PLAYING){ 
     //I got error on this line 
     //I know why i got that error. Coz i dont declare player. 
     //And java don't know what player object exactly? is Bison/SuperBison 
     if (player.isAlive() && player.getState()==Sprite.STATE_NORMAL) { 
      float velocityX = 0; 
      if (moveLeft.isPressed()) { 
       velocityX-=player.getMaxSpeed(); 
      } 
      if (moveRight.isPressed()) { 
       velocityX+=player.getMaxSpeed(); 
      } 
      if (jump.isPressed()) { 
       //My aim is to call this line without if that object 
       player.jump(false); 
      } 
      if (attack.isPressed()){ 
       //My aim is to call this line without if that object 
       player.attack(); 
      } 
      player.setVelocityX(velocityX); 
     } 
    } 
    else 
    { 
     //Set Velocity to zero 
     player.setVelocityX(0); 
    } 

這是可能做到這一點?

感謝

對不起我的英文不好:d

+2

我不明白問題(或標題)。 – 2011-06-14 17:05:03

+0

你究竟得到什麼錯誤信息? 爲什麼你想投資Bizon/SuperBizon呢? – Sorceror 2011-06-14 17:07:01

回答

1

如果我理解正確,Bison和SuperBison有相同的方法。然後你簡單地將你的玩家投給Bison,並且調用Bison方法。

你似乎誤解了鑄造。在Java中,轉換(用於引用類型)決不會更改對象的類型,它只會改變編譯器對對象引用的看法。 對象仍然保持不變,在運行時,虛擬機實際上會檢查這是否是一個合適的對象。

這裏

if(temp instanceof JabangTetuka) { 
    Bison player=(Bison) map.getPlayer(); 
} 
else { 
    SuperBison player=(SuperBison) map.getPlayer(); 
} 

您創建不同類型的兩個變量player,每個只在周邊{...}塊有效。 (即使你的代碼中沒有大括號,塊仍然存在。)

因此,你根本不能使用該變量。

如果您的播放器已經是野牛,那麼你可以簡單地寫

Bison player = (Bison) map.getPlayer(); 

但我有點doublt您的播放器將所有的雪碧,JabangTetuka和野牛的,或者你有一個非常奇怪的繼承關係。

+0

我錯了「JabangTetuka」應野牛。 – Kenjiro 2011-06-14 17:24:13

+0

如果是這樣,因爲SuperBison是Bison的一個子類,所以你的第二次投射永遠不會成功(除了'null',它是castable,但是在'instanceof'檢查中給出'false')。 – 2011-06-14 17:31:45

+0

噢....我看... 謝謝兄弟:D – Kenjiro 2011-06-14 17:39:18

1

沒有足夠的代碼在這裏,以確定是否已經做到了這一點,但必須滿足以下條件,以獲得所需的行爲:

  1. 野牛和超級野牛必須繼承或擴展一個共同的類。
  2. 普通類必須至少抽象地定義Bison和SuperBison共享的方法。
  3. Bison和SuperBison必須重寫通用類的方法。
  4. 您使用的'player'變量應該是普通類的類型。

有了這些東西,多態性應該在你身邊。

0

您的對象player被聲明在if聲明的範圍內,並且不再存在您撥打player.isAlive()的地方。另外,根據你的圖,沒有繼承樹中的類定義isAlive()getState()

此外,作爲DJ昆比指出,您的Creature類可以定義要調用的方法,您可以在BisonSuperBison覆蓋它們給他們他們的特定功能。