2013-03-24 48 views
1

我想我錯過了OOP編程的一些概念,但我不知道究竟是什麼。使用Java繼承

如何使用從不同類創建的對象?

例如,假設我必須使用卡片。有一個卡類,它包含所有的共享屬性。普通卡片和百搭卡片是從卡片類繼承而來的(百搭卡片可以接管任何卡片顏色),並且一張卡片不值錢也不值得分,所以有一張從標準卡繼承的ScoreCard。

UML:

所以,我怎樣才能使用這個模型,當我編程嗎?我在一個數組中創建N卡,並且在生成卡時應該確定實際的卡是否爲小丑/分數/普通卡?後來我該如何測試一張卡片是一張小丑/正常/記分卡?因爲如果ScoreCard有一個private int score;和setter/getters NormalCard不會有這個屬性,所以當我寫一個if語句時,我不知道要測試什麼。

Card[] cardsArray = new Card[52]; 

    for (int i = 0; i<cardsArray.length;i++) { 
     //Some source tells if a card is a Score/Normal/Joker 
     String src; 
     switch (src) { 
      case "Joker":Card[i] = new JokerCard(); 
       break; 
      case "Normal":Card[i] = new NormalCard(); 

       .... etc 
     } 
    } 

    //Some Userevent: 
    ..userevent(Card in) { 
     //Test what 
     if (in.value == 4) { 
      this.user.setScore(this.user.getScore()+in.score); 
     } 

    } 

回答

5

我想你應該瞭解的多態性。它與繼承結合在一起時變得強大:)

事情是,你不應該真正知道卡是否是一個小丑/普通卡/等。 相反,您應該提供一個處理用戶事件的接口/抽象類級別的方法。 所有的「真實」類應該覆蓋這種方法並提供一個實現。 我將展示這一點:

interface Card { 
    void handleUserEvent(UserEvent event); 

}

public class NormalCard implements Card { 
    public void handleUserEvent(UserEvent event) { 
      // do something here 
    } 

}

public class Joker implements Card { 
    public void handleUserEvent(UserEvent event) { 
     // hey I'm a joker 
    } 

}

希望這有助於

+0

好的,所以我應該使用多態性來完成這個工作,謝謝。 – notsoogood 2013-03-24 11:33:29

2

所有卡例如可以有一個int getScore()方法,該方法將總是返回0,除了記分卡的情況。

所有的卡片可能有一個boolean canTake(Card otherCard)這將始終返回真實的JokerCard,並會服從其他卡片的其他規則。

很難給出明確的答案,但是如果你想使用多態性,那麼你需要基類中的方法,必須有一個實現是所有的派生類。

+0

謝謝,這些解釋幫助了很多。 – notsoogood 2013-03-24 11:32:25

-1

使用的instanceof

if(someCard instanceof JokerCard) { 
    /* Some logic here*/ 
} 
else if(someCard instanceOf ScoreCard) { 
    int score = ((ScoreCard) someCard).getScore(); 
    /* some more logic here */ 
} 
0

可以使用的ToString()方法for循環來確定卡的類型,只要你在每個子類中放置一個toString()方法即可。

Card[] cardsArray = new Card[52]; 

    for (int i = 0; i<cardsArray.length;i++) { 
     //Some source tells if a card is a Score/Normal/Joker 
     String src = Card[i].toString; // This should define the type of current card 
     switch (src) { 
      case "Joker":Card[i] = new JokerCard(); 
       break; 
      case "Normal":Card[i] = new NormalCard(); 

       .... etc 
     } 
    } 


public int getScore(Card c){ 
    // Returns the score. In the getScore() method you should already tell if the 
    // card is an Ace or a Joker because you can give it a number of 0 for an Ace or whatever you want. 
    int Score = c.getScore(); 

} 
0

如果您提出了MDA方法,則可以使用該模型生成代碼。有很多工具可以有效地做到這一點。

使用接口您不知道此接口表示的對象的實際類型,在極少數情況下如果您希望這樣做,請使用instanceof語句。

要創建純粹的接口,您不要將變量放在裏面。而是在實現類中使用帶有增變器的private成員。如果要通過接口訪問這些屬性,請將這些增變器作爲public方法放入接口。