2013-06-19 2 views
0

Итак, в Objective-C у меня есть класс PlayingCardDeck (который содержит массив PlayingCards, который является подклассом Карт), который имеет метод drawRandom (унаследованный от класса Deck), который возвращает случайный объект Card из этого массива.Как получить доступ к методам подкласса, когда он назначен переменной типа суперкласса?

У меня есть результат этого метода drawRandom, присвоенного Card * hello, так как возвращается объект карты, поэтому я не могу присвоить результат PlayingCard * hello.

Если бы я хотел получить доступ к некоторым методам, которые я реализовал в PlayingCards, как бы мне это сделать? Я был вынужден назначить Карту, поэтому я не могу получить доступ к каким-либо методам PlayingCard.

Должен ли я переопределить метод drawRandom в PlayingCardDeck, чтобы вместо него вместо него играть PlayingCard?

Или есть ли другой способ сделать это? (поскольку кажется, что это отходы, чтобы переопределить все мои методы суперкласса ... если я это сделаю, в чем смысл подкласса?)

Я просто что-то пропустил?

ответ

0

Похоже, что это недостаток в объектной модели, поэтому, возможно, вы должны вернуть PlayingCards, но если вам нужно это сделать, безопасный способ - проверить класс объекта, а затем бросить его и сделать метод вызывает.

if ([card isKindOfClass: [PlayingCard class]]) { 
    [(PlayingCard*)card doMyPlayingCardMethod]; 
} 

Это безопасно проверяет, что card объект является PlayingCard или производное, а затем вызывает метод -doMyPlayingCardMethod на него.

Насколько «в чем смысл подкласса?» вопрос, это действительно больше для другого случая. Так, например, если у вас были FacePlayingCard и NumberPlayingCard, которые были подклассами PlayingCard, у вас мог бы быть метод -drawCard, который знал, как рисовать лицевые карты иначе, чем числовые карты.

В этом случае, вы абстрагирования Card из PlayingCard, но не там, кажется, все, что вы хотите сделать с Card, так что это своего рода бессмысленное место, чтобы поместить подкласс.

Если, с другой стороны, у вас был CollectingCard, который также был подклассом Card, и вы также хотели иметь возможность перетасовывать их, что могло бы иметь смысл.

+0

Значит, класс проверки и последующий метод метода объекта с обтеканием объекта, который вы описали выше, должны быть выполнены, если у меня есть разные вызовы методов, которые могут возникнуть в результате? Например, имея два подкласса карты Yugioh и Magic Card, которые, возможно, должны вызвать методы [Card trapActivate] vs [Поиск карты]. И в другом случае, о котором вы упомянули в подклассе, была бы ситуация, когда карты Yugioh и Magic были бы названы общим методом [Card activate], где два подкласса имеют другую реализацию. Я правильно понимаю это? – user2503088

+0

Да, у вас это есть. – gaige

+0

Ahhh спасибо! – user2503088

Смежные вопросы