Objective c 当子类方法被分配给超类类型变量时,我如何访问它?

Objective c 当子类方法被分配给超类类型变量时,我如何访问它?,objective-c,class,inheritance,subclassing,Objective C,Class,Inheritance,Subclassing,所以在Objective-C中,我有一个PlayingCardDeck类(它包含一个PlayingCards数组,它是卡片的一个子类),它有一个drawRandom方法(继承自Deck类),该方法从该数组返回一个Random Card对象 我将此drawRandom方法的结果分配给Card*hello,因为返回了一个Card对象,所以我无法将结果分配给PlayingCard*hello 如果我想访问我在PlayingCards中实现的一些方法,我会怎么做?我被强制分配到Card,因此我无法访问任

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

我将此drawRandom方法的结果分配给Card*hello,因为返回了一个Card对象,所以我无法将结果分配给PlayingCard*hello

如果我想访问我在PlayingCards中实现的一些方法,我会怎么做?我被强制分配到Card,因此我无法访问任何PlayingCard方法

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

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


我只是缺少了什么吗?

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

if ([card isKindOfClass: [PlayingCard class]]) {
    [(PlayingCard*)card doMyPlayingCardMethod];
}
这将安全地检查
对象是否为
播放卡
或派生卡,然后对其调用
-doMyPlayingCardMethod
方法

至于“子类化有什么意义?”的问题,实际上更多的是针对另一种情况。因此,例如,如果你有
FacePlayingCard
NumberPlayingCard
这两个都是
PlayingCard
的子类,你可以有一个
-drawCard
方法,它知道如何以不同于数字卡的方式绘制人脸卡

在本例中,您正在从
玩卡
中抽象
,但似乎没有任何您想要使用
的内容,因此它对于放置子类来说是一个毫无意义的地方


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

那么,如果结果可能导致不同的方法调用,那么应该执行上面概述的check类和后续类型大小写对象方法调用吗?例如,有两个子类Yugioh card和Magic card可能需要调用方法[card trapActivate]和[card search]。您提到的另一个子类化情况是,Yugioh card和Magic card都会调用一个公共方法[card activate],这两个子类有不同的实现。我理解正确吗?