Pregunta

¿Alguien puede explicar las diferencias entre Protocolos y Categorías en Objective-C? ¿Cuándo se utiliza una sobre la otra?

¿Fue útil?

Solución

Un protocolo es lo mismo que una interfaz en Java: esto es esencialmente un contrato que dice, "Cualquier clase que implementa este protocolo también se pondrá en práctica estos métodos."

A categoría, por otro lado, apenas se une métodos a una clase. Por ejemplo, en Cacao , puedo crear una categoría para NSObject que me permitirá añadir métodos a la clase <=> (y, por supuesto, todas las subclases), a pesar de realmente no tengo acceso a <=> .

Para resumir: un protocolo especifica qué métodos de una clase implementará; una categoría añade métodos a una clase existente.

El uso adecuado de cada uno, entonces, debe ser claro: Use protocolos para declarar un conjunto de métodos que una clase debe implementar y utilizar categorías para añadir métodos a una clase existente

Otros consejos

Un protocolo dice, "aquí hay algunos métodos que me gustaría para poner en práctica." Una categoría dice, "Les extiendo la funcionalidad de esta clase con estos métodos adicionales."

Ahora, sospecho que su confusión proviene del uso de Apple de la frase "protocolo informal". Aquí está la clave (y más confuso) punto: un protocolo informal no es en realidad un protocolo en absoluto. En realidad es una categoría en NSObject. Cacao utiliza protocolos informales manera generalizada para proporcionar interfaces para los delegados. Desde el @protocol sintaxis no permitió que los métodos opcionales hasta Objective-C 2.0, Apple implementa métodos opcionales para no hacer nada (o devolver un valor ficticio) y métodos necesarios para lanzar una excepción. No había manera de hacer cumplir esto a través del compilador.

Ahora, con Objective-C 2.0, la @optional sintaxis soporta la palabra clave @required, marcando algunos métodos en un protocolo como opcional. Por lo tanto, la clase es conforme a un protocolo siempre que implementa todos los métodos marcados como <=>. El compilador puede determinar si su clase implementa todos los métodos necesarios, también, que es un gran ahorro de tiempo. El iPhone SDK utiliza exclusivamente la sintaxis de Objective-C 2.0 <=>, y no puedo pensar en una buena razón para no usarlo en cualquier nuevo desarrollo (excepto para Mac OS X aplicaciones Cocoa que necesitan para funcionar en versiones anteriores de Mac OS X).

Categorías:

Una categoría es una manera de añadir nuevos métodos para todas las instancias de una clase existente sin modificar la propia clase.

Se utiliza una categoría cuando se desea agregar funcionalidad a una clase existente sin que se derivan de esa clase o re-escritura de la clase original.

Digamos que usted está utilizando NSView objetos en el cacao, y usted se encuentra deseando que todas las instancias de #import fueron capaces de realizar alguna acción. Obviamente, no se puede volver a escribir la clase <=>, e incluso si se derivan de ella, no todos los objetos <=> en su programa será de su tipo derivado. La solución es crear una categoría en <=>, que se utiliza a continuación en su programa. Mientras que <=> el archivo de cabecera que contiene su declaración categoría, aparecerá como si cada <=> objeto responde a los métodos definidos en el archivo de origen categoría.

Protocolos:

Un protocolo es una colección de métodos que cualquier clase puede optar por aplicar.

Se utiliza un protocolo cuando se quiere presentar una garantía de que una cierta clase responderá a un conjunto específico de los métodos. Cuando una clase adopta un protocolo, se compromete a aplicar todos los métodos declarados en la cabecera del protocolo. Esto significa que cualquier otra clase que utilizan esa clase puede estar seguro de que se llevarán a cabo estos métodos, sin necesidad de conocer anyting otra cosa acerca de la clase.

Esto puede ser útil cuando se crea una familia de clases similares que toda necesidad de comunicarse con una clase de "controlador" común. La comunicación entre la clase del controlador y las clases controladas pueden todos ser empaquetado en un único protocolo.

Nota al margen: el lenguaje Objective-C no soporta herencia múltiple (una clase sólo puede derivar de una superclase), pero gran parte de la misma funcionalidad puede ser proporcionada por los protocolos ya que una clase puede ajustarse a varios protocolos diferentes

A mis Protocolos comprensión son un poco como las interfaces de Java. Protocolos declaran métodos, pero la implementación depende de cada clase. Categorías parece ser algo así como mixins de Ruby. Con Categorías puede agregar métodos a las clases existentes. Incluso las clases incorporadas.

Un protocolo permite declarar una lista de métodos que no se limitan a cualquier clase o categoría en particular. Los métodos declarados en el protocolo se pueden adoptar cualquier clase / categorías. Una clase o categoría que adopta un protocolo deben implementa todos los métodos necesarios declarados en el protocolo.

Una categoría le permite añadir métodos adicionales para una clase existente, pero que no permite que las variables de instancia adicionales. Los métodos de la categoría añade convierten en parte del tipo de clase.

Los protocolos son contratos para poner en práctica los métodos especificados. Cualquier objeto que se ajusta un protocolo de acuerdo para proporcionar implementaciones para estos métodos. Un buen uso de un protocolo sería definir un conjunto de métodos de devolución de llamada para un delegado (donde el delegado debe responder a todos los métodos).

Categorías proporcionan la capacidad de extender un objeto actual mediante la adición de métodos al mismo (de clase o instancia métodos). Un buen uso para una categoría sería extender la clase NSString añadir una funcionalidad que no estaba allí antes, tales como la adición de un método para crear una nueva cadena que convierte el receptor en 1337 5P34K.

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

Las definiciones de S.G.Kochan "programación en Objective-C":

Categorías:

Una categoría proporciona una manera fácil para que usted pueda modularizar la definición de una clase en grupos o categorías de métodos relacionados. También le proporciona una manera fácil de extender una definición de clase existente sin ni siquiera tener acceso al código fuente original para la clase y sin tener que crear una subclase.

Protocolos:

Un protocolo es una lista de los métodos que se comparte entre las clases. Los métodos enumerados en el protocolo no tienen implementaciones correspondientes; que están destinados a ser ejecutado por otra persona (como usted!). Un protocolo proporciona una manera de definir un conjunto de métodos que son de alguna manera relacionadas con un nombre especificado. Los métodos son normalmente documentadas para que sepa cómo se van a realizar y por lo que se puede implementar en sus propias definiciones de clases, si se desea. Una lista protocolo de un conjunto de métodos, algunos de los cuales se pueden implementar opcionalmente, y otros que se deben implementar. Si decide implementar todos los métodos necesarios para un protocolo particular, se dice que se ajusta a o adoptar ese protocolo. Se le permite definir un protocolo en el que todos los métodos son opcionales, o uno donde todos son obligatorios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top