iOS:当我从其他类调用重写的方法时会发生什么



我有一个名为Card的超类,它有一个方法:

-(int)match:(NSArray *)otherCards{
    return 0;
}

然后我在名为 PlayingCard 的子类中重写此方法

-(int)match:(NSArray *)otherCards{
    int score = 0;
    if ([otherCards count]==1) {
        PlayingCard *otherCard = [otherCards firstObject];
        if (otherCard.rank==self.rank) {
            score=4;
        }else if ([otherCard.suit isEqualToString:self.suit]){
            score=1;
        }
    }
    return score;
}

但是当我像这样从其他类调用重写的方法时

Card *card=[self cardAtIndex:index];
self.matchScore=[card match:@[otherCard]];

为什么它实现了我在子类中覆盖的方法?我认为匹配分数应该始终为 0,但事实并非如此。我认为它应该在超类中实现该方法,但它没有。为什么?

Objective-C 中的所有方法都是虚拟的。这意味着,称为match:实现取决于card类。因此,如果[self cardAtIndex:index]返回实例PlayingCard,则会调用-[PlayingCard match:]。这正是您的情况。

请注意,声明 Card *card 以及强制转换为超类不会影响运行时中的card类。它仅向编译器提供附加信息,以检测构建时的一些愚蠢错误。

以下可能是原因

[self cardAtIndex:index];

此方法返回 PlayigCard 类的对象,而不是 Card 的对象。因此,对象调用其自己的类而不是超类的实现

您可以通过编写此内容进行验证

if ([card isKindOfClass:[PlayingCard class]) {
      NSLog(@"It's Playing Card not Card");
}

最新更新