2013-06-19 53 views
0

所以在Objective-C中,我有一個PlayingCardDeck類(它包含一個PlayingCards數組,它是Cards的一個子類),它有一個drawRandom方法(從Deck類繼承),它從該數組中返回一個隨機Card對象。當它被分配給超類型變量時,如何訪問子類方法?

我將此drawRandom方法的結果分配給Card * hello,因爲卡對象被返回,所以我無法將結果分配給PlayingCard * hello。

如果我想訪問我在PlayingCards中實現的一些方法,我該怎麼做?我被迫分配給卡,所以我不能訪問任何的PlayCard方法。

我應該重新實現PlayingCardDeck中的drawRandom方法,以便它返回一個PlayingCard嗎?

或者還有其他方法可以做到這一點嗎? (因爲重新實現我所有的超類方法似乎是一種浪費......如果我這樣做了,子類化的意義何在?)

我是否簡單地錯過了某些東西?

回答

0

它看起來像是對象模型中的一個缺陷,所以也許你應該返回PlayingCards,但是如果你需要這樣做,安全的方法是檢查對象的Class,然後將其施放並使其該方法調用。

if ([card isKindOfClass: [PlayingCard class]]) { 
    [(PlayingCard*)card doMyPlayingCardMethod]; 
} 

這安全地檢查該card對象是PlayingCard或其衍生物,然後調用-doMyPlayingCardMethod方法就可以了。

至於「子類化的要點是什麼?」問題,對另一種情況來說更是如此。因此,例如,如果您有FacePlayingCardNumberPlayingCard,它們都是PlayingCard的所有子類,則可以使用-drawCard方法,該方法知道如何繪製面牌的方式與數字卡的不同。

在這種情況下,你從PlayingCard抽象Card,但似乎沒有給你想要與Card做任何事情,所以這是一種毫無意義的地方放子類。

另一方面,如果你有CollectingCard這也是Card的子類,並且你希望能夠將它們洗牌,那會更有意義。

+0

因此,如果我有不同的方法調用可能會導致結果,那麼應該完成上面概述的檢查類和後續的類型對象方法調用?例如,有兩個子類Yugioh卡和Magic卡可能需要調用[Card trapActivate]和[Card search]方法。另外一個你提到的子類化的情況是Yugioh卡和Magic卡都會調用一個通用的方法[Card activate],其中兩個子類有不同的實現。我是否正確理解這一點? – user2503088

+0

是的,你明白了。 – gaige

+0

啊啊,謝謝! – user2503088

相關問題