2014-09-10 3 views
0

Допустим, у меня есть класс Deck, основанный на NSObject. У нас также есть PlayingCardDeck, который основан на классе Deck.Может ли метод возвращать другой тип возврата, кроме указанного?

Как этот метод легок?

-(Deck *) createDeck 
{ 

    return [[PlayingCardDeck alloc]init]; 
} 
+0

Да, если PlayingCardDeck происходит от колоды. Это обычно полезно, когда у вас есть несколько подклассов. – puru020

+0

Конечно, законно возвращать подкласс объявленного типа возврата - подкласс всегда может быть заменен его суперклассом. И в Objective-C нет ничего (кроме предупреждающего сообщения), чтобы действительно предотвратить возврат метода, скажем, NSString из метода, объявленного для возврата NSNumber. –

+0

Рассмотрите возможность применения метода класса и его переименование в соответствии с рекомендациями по кодированию какао. Результирующая подпись будет '+ (Deck *) deck', и вы бы вызывали ее так:' Deck * myDeck = [Deck deck]; ' – jlehr

ответ

1

предположив, что вы правильно запрограммировали наследование объектов: да, это законно, потому что ваш PlayingCardDeck действительно Deck.

1

Да, метод может возвращать другой тип, если он совместим с указанным.

У нас есть PlayingCardDeck, который основан на классе Deck.

Тогда совершенно нормально, чтобы вернуть экземпляр PlayingCardDeck, потому что это Deck.

Этот метод очень важен и популярен в ООП. Это позволяет скрыть реализацию и открыть интерфейс. Например, вы можете сделать несколько реализаций Deck, но пусть ваши пользователи знают только класс Deck верхнего уровня. Это дает вам гибкость в выборе реализации, не нарушая код вашего пользователя.

Какао-каркас также использует эту концепцию много. Например, некоторые методы NSString с возвратным типом NSString фактически возвращают подкласс NSString. Поскольку код пользователя не обязательно должен знать о подклассе, он может удобно писать NSString и программировать его интерфейс.

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