Да, метод может возвращать другой тип, если он совместим с указанным.
У нас есть PlayingCardDeck
, который основан на классе Deck
.
Тогда совершенно нормально, чтобы вернуть экземпляр PlayingCardDeck
, потому что это Deck
.
Этот метод очень важен и популярен в ООП. Это позволяет скрыть реализацию и открыть интерфейс. Например, вы можете сделать несколько реализаций Deck
, но пусть ваши пользователи знают только класс Deck
верхнего уровня. Это дает вам гибкость в выборе реализации, не нарушая код вашего пользователя.
Какао-каркас также использует эту концепцию много. Например, некоторые методы NSString
с возвратным типом NSString
фактически возвращают подкласс NSString
. Поскольку код пользователя не обязательно должен знать о подклассе, он может удобно писать NSString
и программировать его интерфейс.
Да, если PlayingCardDeck происходит от колоды. Это обычно полезно, когда у вас есть несколько подклассов. – puru020
Конечно, законно возвращать подкласс объявленного типа возврата - подкласс всегда может быть заменен его суперклассом. И в Objective-C нет ничего (кроме предупреждающего сообщения), чтобы действительно предотвратить возврат метода, скажем, NSString из метода, объявленного для возврата NSNumber. –
Рассмотрите возможность применения метода класса и его переименование в соответствии с рекомендациями по кодированию какао. Результирующая подпись будет '+ (Deck *) deck', и вы бы вызывали ее так:' Deck * myDeck = [Deck deck]; ' – jlehr