0

所以在 Objective-C 中,我有一个 PlayingCardDeck 类(它包含一个 PlayingCards 数组,它是 Cards 的一个子类),它有一个 drawRandom 方法(从 Deck 类继承),它从该数组中返回一个随机 Card 对象。

我将这个 drawRandom 方法的结果分配给 Card *hello,因为返回了一个卡片对象,所以我不能将结果分配给 PlayingCard *hello。

如果我想访问我在 PlayingCards 中实现的一些方法,我该怎么做?我被迫分配给 Card,所以我无法访问任何 PlayingCard 方法。

我应该在 PlayingCardDeck 中重新实现 drawRandom 方法,以便它返回 PlayingCard 吗?

还是有其他方法可以做到这一点?(因为必须重新实现我所有的超类方法似乎是一种浪费……如果我这样做,那么子类化有什么意义?)

我只是错过了什么吗?

4

1 回答 1

0

它看起来像对象模型中的一个缺陷,所以也许你应该 return PlayingCards,但如果你需要这样做,安全的方法是检查对象的 Class,然后对其进行转换并进行方法调用。

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

这可以安全地检查card对象是 aPlayingCard还是派生类,然后调用-doMyPlayingCardMethod它的方法。

至于“子类化有什么意义?” 问题,对于另一种情况来说真的更多。因此,例如,如果您有FacePlayingCard并且NumberPlayingCard它们都是 的子类PlayingCard,那么您可以有一个-drawCard方法知道如何以不同于数字卡的方式绘制面卡。

在这种情况下,您Card从抽象PlayingCard,但似乎没有任何您想做的事情Card,因此放置子类是一种毫无意义的地方。

另一方面,如果你有CollectingCard它也是一个子类,Card并且你也希望能够对它们进行洗牌,那会更有意义。

于 2013-06-19T23:19:46.020 回答