0

ここにはたくさんの役立つスレッドがありましたが、投稿するのはこれが初めてです。

私は悪名高いスタンフォードの OpenCourse プロジェクトである 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クラス methoddrawとそのサブクラスCircleおよびRectangleで、どちらもメソッドをオーバーライドして、draw特定の方法で自分自身をレンダリングします。

Card基本クラスについても同様で、独自のインターフェイス メソッドを呼び出しますがmatch、オブジェクトは実際には のインスタンスでCardはなく、PlayingCardサブクラスのインスタンスであるため、特定の実装を提供する代わりにサブクラス メソッドが呼び出されます。

于 2013-08-22T09:39:37.293 に答える
0

View Controller .m ファイルでは、プロパティ「deck」をクラス PlayingCardDeck として初期化する必要があり、PlayingCardDeck.m では、カードのクラスは PalyingCard です。したがって、カードを Card クラスとして宣言したとしても、それが呼び出すメソッドは PlayingCard クラスのメソッドのままです。

于 2013-08-23T00:58:45.707 に答える