Pergunta

Alguém pode explicar as diferenças entre Protocolos e Categorias em Objective-C? Quando você usa um sobre o outro?

Foi útil?

Solução

Um protocolo é a mesma coisa que uma interface em Java: "Qualquer classe que implementa este protocolo também irá implementar esses métodos" é essencialmente um contrato que diz:

A categoria, por outro lado, apenas se liga métodos para uma classe. Por exemplo, em Cocoa , posso criar uma categoria para NSObject que me permite adicionar métodos para a classe NSObject (e, é claro, todas as subclasses), mesmo que eu não fazer realmente tem acesso a NSObject .

Para resumir: um protocolo especifica que métodos de uma classe irá implementar; uma categoria adiciona métodos para uma classe existente.

O uso adequado de cada um, em seguida, deve ser clara:. Usar protocolos para declarar um conjunto de métodos que uma classe deve implementar e categorias de uso para adicionar métodos a uma classe existente

Outras dicas

Um protocolo diz, "aqui estão alguns métodos que eu gostaria você de implementar." A categoria diz: "Eu estou estendendo a funcionalidade desta classe com estes métodos adicionais."

Agora, eu suspeito que sua confusão decorre do uso da Apple da frase "protocolo informal". Aqui está a chave (e mais confuso) ponto: um protocolo informal não é realmente um protocolo em tudo. É realmente uma categoria em NSObject. Cacau usa protocolos informais pervasively para fornecer interfaces para os delegados. Desde a sintaxe @protocol não permitiu métodos opcionais até Objective-C 2.0, a Apple implementou métodos opcionais para não fazer nada (ou devolver um valor fictício) e métodos necessários para lançar uma exceção. Não havia nenhuma maneira de fazer cumprir isso através do compilador.

Agora, com Objective-C 2.0, a sintaxe @protocol suporta a palavra-chave @optional, marcação de alguns métodos de um protocolo como opcional. Assim, seus conforma classe para um protocolo, contanto que implementa todos os métodos marcados como @required. O compilador pode determinar se seus classe implementa todos os métodos necessários, também, que é uma enorme economia de tempo. O iPhone SDK usa exclusivamente o Objective-C sintaxe 2.0 @protocol, e eu não posso pensar em uma boa razão para não usá-lo em qualquer novo desenvolvimento (exceto para Mac OS X Cocoa aplicativos que precisam ser executados em versões anteriores do Mac OS X ).

Categorias:

A categoria é uma forma de adicionar novos métodos para todas as instâncias de uma classe existente, sem modificar a própria classe.

Você pode usar uma categoria quando você deseja adicionar funcionalidade a uma classe existente sem derivar dessa classe ou re-escrever a classe original.

Vamos dizer que você está usando NSView objetos no cacau, e você encontrar-se desejando que todas as instâncias do NSView foram capazes de realizar alguma ação. Obviamente, você não pode reescrever a classe NSView, e mesmo se você tirar dela, nem todos os objetos NSView em seu programa vai ser de seu tipo derivado. A solução é criar uma categoria em NSView, que você usar em seu programa. Contanto que você #import o arquivo de cabeçalho contendo o seu declaração categoria, ele aparecerá como se todas NSView objeto responde aos métodos que você definiu no arquivo de origem categoria.

Protocolos:

Um protocolo é um conjunto de métodos que qualquer classe pode optar por implementar.

Você usa um protocolo quando você deseja fornecer uma garantia de que uma certa classe irá responder a um conjunto específico de métodos. Quando uma classe adota um protocolo, que promete implementar todos os métodos declarados no cabeçalho do protocolo. Isto significa que quaisquer outras classes que usam essa classe pode ter certeza de que esses métodos serão implementadas, sem precisar saber anyting mais sobre a classe.

Isto pode ser útil ao criar uma família de classes semelhantes que todos necessidade de se comunicar com um comum classe "controlador". A comunicação entre o controlador de classe e as classes controladas podem ser embalados num único protocolo.

Nota lateral: a linguagem Objective-C não suporta herança múltipla (a classe só pode derivar de uma superclasse), mas grande parte da mesma funcionalidade pode ser fornecido por protocolos porque uma classe pode estar de acordo com vários protocolos diferentes

Para os meus protocolos compreensão são um pouco como Interfaces de Java. Protocolos declarar métodos, mas a implementação depende de cada classe. Categorias parece ser algo como mixins do Ruby. Com categorias que você pode adicionar métodos para classes existentes. Mesmo built-in classes.

Um protocolo permite que você declare uma lista de métodos que não se limitam a qualquer classe ou categorias particular. podem ser adoptados os métodos declarados no protocolo de qualquer classe / categorias. Uma classe ou categoria que adota um protocolo deve implementa todos os métodos necessários declarado no protocolo.

A categoria permite que você adicione métodos adicionais para uma classe existente, mas eles não permitem que as variáveis ??de instância adicionais. Os métodos a categoria adiciona tornar-se parte do tipo de classe.

Os protocolos são contratos para implementar os métodos especificados. Qualquer objecto que está em conformidade com um protocolo concorda em fornecer implementações para esses métodos. Um bom uso de um protocolo seria definir um conjunto de métodos de retorno de chamada para um delegado (onde o delegado deve responder a todos os métodos).

Categorias de fornecer a capacidade de estender um objecto actual por adição de métodos para ele (classe ou instância métodos). Um bom uso para uma categoria seria estender a classe NSString para adicionar funcionalidade que não estava lá antes, como a adição de um método para criar uma nova string que converte o receptor em 1337 5P34K.

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

As definições de "programação em Objective-C" da S.G.Kochan:

Categorias:

A categoria fornece uma maneira fácil para você modularizar a definição de uma classe em grupos ou categorias de métodos relacionados. Ela também lhe dá uma maneira fácil de estender uma definição de classe existente, mesmo sem ter acesso ao código fonte original para a classe e sem ter que criar uma subclasse.

Protocolos:

Um protocolo é uma lista de métodos que são compartilhados entre classes. Os métodos listados no protocolo não têm implementações correspondentes; eles foram feitos para ser implementada por alguém (como você!). Um protocolo proporciona uma maneira de definir um conjunto de métodos que estão de alguma forma relacionadas com um nome especificado. Os métodos são tipicamente documentados de modo que você sabe como eles são para executar e para que você possa implementá-los em suas próprias definições de classe, se desejado. A lista de protocolos um conjunto de métodos, alguns dos quais você pode opcionalmente implementar, e outros que você é obrigado a implementar. Se você decidir implementar todos os métodos necessários para um determinado protocolo, você está dito para estar em conformidade com ou adotar esse protocolo. Você está autorizado a definir um protocolo em que todos os métodos são opcionais, ou aquele em que todos são necessários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top