0

我在这里看到了很多有用的帖子,但这是我第一次发帖!

我正在研究臭名昭著的斯坦福开放课程项目:Matchismo。虽然我一切顺利,但我不理解示例代码的一部分。

基本上,下面的代码用于获取 Card 对象以与另一张卡进行比较。

- (void) flipCardAtIndex: (NSUInteger)index
{
    Card *card = [self cardAtIndex:index];
    if (card && !card.isUnplayable)
    {
        if (!card.isFaceUp)
        {
            for (Card* otherCard in self.cards)//for-in loop
            {
                if (otherCard.isFaceUp && !otherCard.isUnplayable)
                {
                    int matchScore = [card match:@[otherCard]];
......

这就是 cardAtIndex 的工作原理:

-(Card *) cardAtIndex:(NSUInteger)index
{
    if (index < [self.cards count])
        //dot notation is used for property
        //[] is used for method
    {
        return self.cards[index];
    }
    return nil;
}

以下是 Match(card*) 和 Match(playingCard) 的方法

匹配(卡*)

-(int) match:(NSArray *)otherCards
{
    NSLog(@"here");
    int score = 0;

    for (Card *card in otherCards)
    {
        if ([card.content isEqualToString:self.content])
            score = 1;
        {
            NSLog(@"Card Match");
        }

    }
    return score;
}

比赛(扑克牌*)

-(int) match: (NSArray *)otherCards;
{
    int score = 0;
    if ([otherCards count] == 1)
    {
        PlayingCard *otherCard = [otherCards lastObject];//the last object in the array
        if ([otherCard.suit isEqualToString:self.suit])
            score = 1;
        else if (otherCard.rank == self.rank)
            score = 4;
        NSLog(@"PlayingCard Match");
    }
    return score; 
}

它工作得很好,但我不明白为什么当 Card* 对象调用一个方法时,它的子类的 PlayingCard 的方法被调用。非常感谢你帮助我!

4

2 回答 2

1

这个概念称为多态性

它允许您拥有一个提供某些接口的基类,以及一组以不同方式实现这些方法的子类。经典示例是Drawable类方法draw及其子类CircleRectangle,它们都覆盖该draw方法以某种特定方式呈现自己。

对于您的Card基类也是如此,它调用自己的接口方法match,但是作为对象实际上不是实例Card,而是子类的实例,而是PlayingCard调用子类方法以提供特定的实现。

于 2013-08-22T09:39:37.293 回答
0

在您的视图控制器.m 文件中,属性“deck”必须初始化为 PlayingCardDeck 类,而在 PlayingCardDeck.m 中,卡片的类是 PayingCard。因此,即使您将卡片声明为 Card 类,它调用的方法仍然是 PlayingCard 类中的方法。

于 2013-08-23T00:58:45.707 回答