Como usar protocolos para definir métodos para ios

Um protocolo define conjuntos de métodos que podem ser implementadas por qualquer classe. Pense de protocolos como a definição de interfaces que as classes têm de implementar. Protocolos são muitas vezes utilizados para especificar a interface para objetos delegados.

Com o recurso de protocolo, você pode evitar ter que forçar subclasses, a fim de criar classes polimórficas. Objective-C (ao contrário do C ++) não permite que uma classe de ter várias superclasses. Protocolos, portanto, são uma característica essencial em Objective-C, porque ele não permite herança múltipla.

Quando uma classe implementa os métodos em um protocolo, a classe é dito conformar-se para o protocolo.

A definição de um protocolo é semelhante à definição de uma interface para uma classe. No entanto, um protocolo não tem uma classe pai ou instância variáveis. Aqui está um exemplo de uma definição de protocolo (para impressão) a partir do programa de calculadora postfix:

@protocol Printable- (void) printMe- // posso deixar de fora @required, uma vez que é o padrão @ opcional - (NSString *) printMeToString - d

Com a chegada (e na verdade, com grande alarde) de objectivo C-2,0, métodos de protocolo pode ser necessária quer (o padrão) ou opcional.

Aqui está a declaração do StackOfInteger afirmando que ele vai implementar o protocolo: StackOfInteger @interface: NSObject ... -d


Aqui é a implementação do protocolo na classe StackOfInteger:

@implementation StackOfInteger- ... Outros métodos StackOfInteger ... /////////// métodos para implementar o protocolo de impressão //////////// - (void) PrintMe {int k, stackCount = [ elementos contar] -NSLog (@"Empilhe-gt; Última gt; dlt%; n", Auto-gt; última) -para (k = 0- k

Observe que o método printMeToString não é implementada porque é opcional.

Um programa pode testar se um objecto está em conformidade com um protocolo. O código a seguir apresentam-se exemplos deste teste (retirado do programa principal da amostra):

 printf ("Testando a conformidade com protocolsn") -se ([MyStack conformsToProtocol: @protocol (imprimível)]) {printf ("Usando o protocolo methodsn") - [MyStack PrintMe] -} else {NSLog (@"Objeto não está de acordo com o protocolo% @ n", @protocol (impressão)) -} ID someObject = [[PostfixCalculator alloc] initWithExpression: @"44 55 *"] -se ([someObject conformsToProtocol: @protocol (impressão)]) {NSLog (@"Objeto não está de acordo com o protocolo") -}

Uma vez que o objecto MyStack está em conformidade com o protocolo, os seus métodos de PrintMe e printMeToString são chamados. Desde someObject (que é tipo de ID para fazer o exemplo mais significativo) não se conforma com o protocolo para impressão, o teste de conformidade falha.

Você também pode testar para a existência de um método opcional usando o respondsToSelector método.

Você pode fazer uma classe adotar um protocolo simplesmente executando os métodos definidos pelo protocolo. Ou seja, você não tem que declarar o protocolo em sua interface. No entanto, mesmo que a classe implementa os métodos protocolos, ele vai não ser compatível com o protocolo e irá falhar o teste de conformidade anterior.


Publicações relacionadas