93 votes

Différences entre les interfaces Java et Objective-C protocoles ?

Je sais que Java, et maintenant j’apprends Objective-C. Quels sont les différences entre les interfaces Java et Objective-C protocoles ?

82voto

Quinn Taylor Points 29688

Tout d'abord, un peu de perspective historique sur le sujet, à partir de l'un des créateurs de Java. Ensuite, Wikipédia est modérément utile à la section sur l'Objective-C protocoles. En particulier, de comprendre que l'Objective-C prend en charge deux protocoles officiels (qui sont explicitement déclarées avec l' @protocol mot-clé, soit l'équivalent d'une interface Java) et informel protocoles (juste une ou de plusieurs méthodes implémentées par une classe, ce qui peut être découvert par la réflexion).

Si vous adopter un protocole formel (Objective-C de la terminologie de "mettre en œuvre une interface"), le compilateur émet des avertissements pour les méthodes non implémentées, comme vous pouvez attendre en Java. Contrairement à Java (comme skaffman mentionné), si un Objectif-C classe implémente les méthodes contenues dans un protocole officiel, il est dit à "se conformer" à ce protocole, même si son interface n'est pas explicitement l'adopter. Vous pouvez le protocole de test de conformité dans le code (à l'aide d' -conformsToProtocol:) comme ceci:

if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
    ...
}

REMARQUE: Apple documentation états:

"Cette méthode permet de déterminer la conformité uniquement sur la base des déclarations formelles dans les fichiers d'en-tête, comme illustré ci-dessus. Il ne vérifie pas si les méthodes déclarées dans le protocole sont effectivement mis en œuvre-c'est le programmeur de la responsabilité."

Comme d'Objective-C 2.0 (mac OS X 10.5 "Leopard" et iOS), les protocoles officiels peuvent désormais définir des méthodes optionnelles, et une classe est conforme à un protocole tant qu'il implémente toutes les méthodes requises. Vous pouvez utiliser l' @required (par défaut) et @optional mots clés pour choisir si les déclarations de méthode qui suivent doivent ou peuvent être mis en œuvre pour respecter le protocole. (Voir la section d'Apple en Objective-C 2.0 Langage de Programmation guide qui traite de protocole facultatif méthodes.)

Protocole facultatif méthodes d'ouvrir beaucoup de flexibilité aux développeurs, en particulier pour la mise en œuvre des délégués et des auditeurs. Au lieu de l'étendre à quelque chose comme un MouseInputAdapter (ce qui peut être gênant, depuis Java est également unique héritage) ou la mise en œuvre de beaucoup d'inutile, vide méthodes, vous pouvez adopter un protocole et la mise en œuvre que les méthodes optionnelles qui vous intéressent. Avec ce modèle, l'appelant vérifie si la méthode est mise en œuvre avant de l'appeler (à l'aide d' -respondsToSelector) comme suit:

if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
    [myObject fillArray:anArray withObject:foo];
    ...
}

Si les frais généraux de la réflexion devient un problème, vous pouvez toujours mettre en cache le résultat booléen pour la réutilisation, mais résistez à l'envie d'optimiser prématurément. :-)

18voto

Tom Jefferys Points 8065

Ils sont presque identiques. Cependant la seule chose qui m'a pris, c'est que, sauf si vous explicitement déclarer qu'un objectif C protocole met également en œuvre NSObject, les références à ce protocole ne pas accéder aux méthodes de NSObject déclare (sans un avertissement du compilateur de toute façon). Avec java, vous pouvez avoir une référence à une interface, et encore appeler toString (), etc.

par exemple

Objectif C:

@protocol MyProtocol
// Protocol definition
@end

id <MyProtocol> myProtocol;

 [myProtocol retain] // Compiler warning

Java:

public interface MyInteface {
// interface definition
}

MyInterface myInterface;

myInterface.toString();  // Works fine.

Objective-C (fixe):

@protocol MyProtocol <NSObject>
// Protocol definition
@end

id <MyProtocol> myProtocol;

[myProtocol retain] // No Warning

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