2010-12-07 32 views
9

La réponse simple serait le protocole.Quel est l'équivalent d'une fonction pure-virtuelle C++ dans Objective-C?

L'autre point est qu'il est dit que toutes les méthodes dans ObjectC sont virtuelles, donc pas besoin de dire virtuel dans ObjC.

J'ai du mal à comprendre ce concept.

Avez-vous trouvé un commentaire plus clair sur cette question?

Merci d'avoir commenté.

+0

http://stackoverflow.com/questions/5222083/implement-a-pure-virtual-method-in-objective-c –

Répondre

13

réponse simple serait Protocole.

Simple mais fausse. Un protocole est une spécification d'interface. C'est une collection de messages qu'un objet doit (en ignorant le mot-clé @optional pour l'instant) répondre à.

Le terme «fonction virtuelle» n'a pas de contrepartie directe dans Objective-C. En Objective-C vous n'appelez pas de fonctions sur les objets, vous leur envoyez des messages. L'objet lui-même décide ensuite comment répondre au message, généralement en recherchant le message dans son objet de classe, en trouvant la méthode associée et en l'invoquant. Notez que tout cela se produit au moment de l'exécution, pas au moment de la compilation.

Le mappage entre les messages (ou «sélecteurs» pour leur donner leur terme technique) et les méthodes est entièrement construit à partir du . Les déclarations de méthode dans le @interface sont uniquement là pour donner au compilateur les informations dont il a besoin pour vous avertir que vous avez peut-être oublié une implémentation de méthode. Et ce n'est qu'un avertissement car vous ne pouvez pas dire avant l'exécution si l'objet répond vraiment au message ou non. Par exemple, quelqu'un d'autre pourrait ajouter une catégorie à une classe existante qui fournit des implémentations pour des méthodes manquantes, ou une classe pourrait surcharger forwardingTargetForSelector: pour transférer les messages auxquels elle ne répond pas ailleurs.

+0

+1 Assez proche. Bien que vous puissiez examiner les méthodes sur les objets C++ en envoyant un message à cet objet, il suffit que la liaison du message soit effectuée au moment de la compilation plutôt qu'à l'exécution. –

+1

@Martin York: Merci pour le vote. Oui, vous pouvez appeler une fonction sur un objet C++ en envoyant un message, mais ce n'est pas vraiment vrai et ce n'est pas très utile, alors que c'est vrai en Objective-C et c'est utile. – JeremyP

+1

Je pense que les auteurs d'OO ne seraient pas d'accord avec vous là-bas. C'est exactement le concept d'une méthode (un message à l'objet). La différence importante entre C++ et Obj-C est seulement la liaison de l'appel à la méthode actuelle. C++ est fait au moment de la compilation Obj-C est fait à l'exécution (c'est la seule différence). Un bon résumé des références relatives à OO-P peut être trouvé ici. http://en.wikipedia.org/wiki/Object-oriented_programming –

2

Les méthodes sur les objets dans Objective-C ne sont pas des fonctions virtuelles, ce sont des fonctions réelles.

Je ne suis pas d'accord, les méthodes d'Obj-C ne sont pas vraiment réelles comme on pourrait s'y attendre. Ils se comportent comme des fonctions virtuelles en C++, sauf que vous ne pouvez pas faire une fonction 'pure virtuelle' en Objective-C.

Cheers, Raxit