2013-02-08 3 views
1

Мне интересно, почему [NSDate distantPast] и [NSDate distantFuture] методы возвращают типы типа id? Почему эти методы не возвращают указатель NSDate?Почему методы [NSDate remotePast] и [NSDate farFuture] возвращают id?

+0

Связанные: [Методы класса, которые создают новые экземпляры] (http://stackoverflow.com/q/5987969) –

+0

** Обновление: ** На данный момент [они _do_ возвращают 'NSDate *'] (https: //developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/clm/NSDate/distantFuture). –

ответ

5

Поскольку полиморфизм справедлив только в одном случае.

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

-(NSDate*) distantPast; 

Но вы не сможете присвоить результат выражения в указатель типа подкласса, и вы будете нуждаться на обратное приведение результата:

NSDateSubclass* ptr= (NSDateSubclass*)[someDateSubclassInstance distantPast]; 
// Downcasting is necessary here, it would give a warning or syntax error otherwise. 

Даже если вы уверены, что возвращаемый объект является подклассом NSDate, необходимо обратное приведение результата. Вот почему все методы, возвращающие созданные объекты, объявляются для возврата идентификатора.

+1

** Обновление: ** На данный момент [они _do_ возвращают 'NSDate *'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/ОКК/CLM/NSDate/distantFuture). –

3

NSDate является абстрактный суперкласс, и distantPast или distantFuture вернуть частные подклассы NSDate, а не NSDate сами по себе.

+1

Тип возврата может иметь тип NSDate, так как полиморфизм действителен. Вы заметили, что все статические методы возвращают id? –

+0

Большинство методов экземпляра также работают. – iluvcapra

1

Я думаю, что этот вопрос также спрашивает, что вы должны вернуть по методу init? Идентификатор или указатель на наш класс.

Поскольку в этом случае это будет то же самое, вы можете считать, что это определенная стандартизация со стороны Apple для методов класса.

1

Нет особых причин для этого. Другой плакат указал, что эти методы могут возвращать частный подкласс NSDate, но подкласс NSDate по-прежнему является NSDate. Я предполагаю, что эти методы достаточно стары (т. Е. NextStep, перед Mac OS), что причины для возвращаемого типа id являются историческими и «утрачены до древности». (Если вы посмотрите на эти методы в документах Mac OS, то говорится, что они были определены в Mac OS 10.0)

Я уверен, что старый подход к школе заключался в том, чтобы везде использовать указатели на анонимные объекты.

+0

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

+0

Верно, что кластер классов не является причиной возвращаемого типа 'id'. Возврат подкласса через возвращаемый тип суперкласса допустим: '- (NSArray *) myArrayProperty {return _myInternalArrayWhichIsActuallyMutable; } 'отлично. Это наследование - это проблема: если '+ [NSArray array]' return '(NSArray *)', то 'NSMutableArray * array = [NSMutableArray array];' заставит компилятор жаловаться. –

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