我有一个名为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,但它并不是。我认为它应该在超类中实现该方法,但它并没有。为什么呢?
答案 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");
}