我有一个名为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");
}