Идея типа суперкласса, хотя и является хорошей теорией, на самом деле не оправдывает себя: A NSString *
равно a NSObject *
. Нет причин, по которым это нельзя назвать таковым.
Вместо этого я думаю, что это больше связано с сигнатурами функций. В динамическом языке, таком как Objective-C, вы не можете знать, с каким классом вы обмениваетесь сообщениями. Но компилятор должен знать, какой тип возвращается. Это и история Objective-C программирования на основе соглашений (а не наличие строгих правил) означает, что ваш подкласс может вернуть NSRect
(a struct
) или NSInteger
(скаляр) из init
. Это было странно, но верно.
C ++ имеет похожую проблему, см. Является ли тип возвращаемого значения частью сигнатуры функции? .
Таким образом, нам нужен был один тип для всех методов с сигнатурой -(id)init
, и id
было единственным, что имело смысл, поскольку указывало только, что возвращаемый тип является экземпляром. Этого достаточно для правильной работы компилятора. Теперь у нас есть instancetype
, что соответствует сообщаемому классу.