28 votes

Dans Objective-C, pourquoi id est-il utilisé comme type de retour pour les méthodes init?

J'ai fait quelques recherches rapides et je n'ai pas trouvé de réponse à cela.

Je suis intéressé de savoir pourquoi dans Objective-C, id est utilisé comme type de retour pour les méthodes init.

Je suppose que c'est parce que si la classe est surchargée, vous ne voulez pas retourner un objet du type de la superclasse, mais je suis intéressé de savoir si cela est fait pour une autre raison.

16voto

Sean Points 4203

Ouaip. Votre idée est juste sur l'argent. Une sous-classe doit toujours pouvoir utiliser les méthodes d'initialisation de sa superclasse et renvoyer son propre type au lieu du super type et le renvoi de id permet de le faire.

5voto

Steven Fisher Points 22249

La super-classe type d'idée, alors qu'une bonne théorie, n'a pas vraiment debout: Un NSString * est un NSObject *. Il n'y a pas de raison qu'il ne peut pas être cité en tant que tel.

Au lieu de cela, je pense qu'il a plus à voir avec les signatures de fonction. Dans un langage dynamique comme Objective-C, vous pouvez avoir aucune idée de quelle classe vous êtes à la messagerie. Mais le compilateur doit savoir de quel type est retourné. Que et Objective-C de l'histoire de la convention de base de la programmation (plutôt que d'avoir des règles strictes) signifie que votre sous-classe peut retourner un NSRect a struct) ou NSInteger (un scalaire) à partir de init. C'était dingue, mais valide.

C++ a un problème similaire, voir Est le type de retour de la partie de la signature de la fonction?.

Nous avons donc besoin d'un type unique pour toutes les méthodes avec signature de l' -(id)init, et id était la seule chose qui fait sens qu'il indique seulement que le type de retour est un exemple. C'est assez pour le compilateur de faire la bonne chose. Maintenant, nous avons instancetype, ce qui correspond à la classe de messaged.

3voto

Stephan Points 1274

Entre-temps, Apple a ajouté une nouvelle façon de déclarer le type de retour des méthodes init .

C'est instancetype . En savoir plus, par exemple ici

2voto

Mike K Points 2043

il est possible que init retourne réellement une instance d'une classe différente, donc id est utilisé. Je ne peux pas dire que j'aie jamais vu cela se produire dans la pratique, mais bon :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X