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

时间:2016-03-04 03:18:55

标签: objective-c

我有一个名为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]];

为什么它实现了我在子类中重写的方法?我认为matchScore应该始终为0,但它并不是。我认为它应该在超类中实现该方法,但它并没有。为什么呢?

2 个答案:

答案 0 :(得分:1)

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

请注意,声明Card *card以及转换为超类不会影响运行时中的card类。它只为编译器提供了额外的信息,以便在构建时检测一些哑错误。

答案 1 :(得分:0)

以下可能是

的原因
[self cardAtIndex:index];

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

的实现

你可以通过写这个来验证

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