Pergunta

Eu gostaria de uma variável de instância do objeto a adoção de um protocolo.

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer *content <CocosNodeOpacity>;
}

Por exemplo, eu gostaria que o meu objeto de Camada para adotar o <CocosNodeOpacity> para que eu possa obter os métodos

-(GLubyte) opacity;    //and
-(void) setOpacity: (GLubyte) opacity;

para livre.A sintaxe mostrada acima é inválido.É possível fazer isso sem criar um novo arquivo de implementação e a criação de um objeto personalizado?Obrigado.

Foi útil?

Solução

Se estes são todos do código criado por você, a melhor maneira de fazer isso é, provavelmente, fazer o Layer própria classe adotar o protocolo, em vez de variável.

@interface Layer : NSObject <CocosNodeOpacity> { ... }

Um benefício chave para esta abordagem é que o compilador irá verificar se você implementar todos os métodos necessários no protocolo em tempo de compilação, o que é geralmente o que você deseja.Adicionando os métodos no mesmo lugar que o resto do padrão de classe de implementação é mais fácil de entender (não caça para encontrar onde o mágico código veio) e menos frágil do que o uso de categorias (adicionando o mesmo método através de diferentes categorias podem resultar em comportamento indefinido).Como regra geral, eu só uso quando eu categorias tem para, tais como a adição de métodos de para (de código-fonte fechado) com código de terceiros.

Se você não controlar a fonte de Layer, você pode ter que usar isso em vez disso, quando você declarar seu ivar:

Layer<CocosNodeOpacity> *content;

Observe que a adoção de um protocolo permite que você estaticamente tipo de variáveis com um tipo de classe e obter compilar avisos se os métodos não estão presentes.No entanto, você não obter os métodos "de graça", pois você ainda tem para implementá-las.Ainda, o uso judicioso de protocolos e tipagem estática pode tornar seu código mais robusto e "fail-fast" de usar id como o tipo para tudo.Você está a ser elogiado por não basta tomar o caminho mais fácil.:-)

Para alguns detalhes sobre protocolos (incluindo necessários e opcionais métodos) ver deste MODO a resposta.

Outras dicas

Um protocolo no Objective-C é semelhante a uma interface em Java. O protocolo define um conjunto de funções e atua como um contrato. É como dizer "Eu garanto que, seja qual for esse objeto, ele tem esses métodos".

Você está bem perto da sintaxe no seu primeiro bloco de código. Na verdade, seria algo assim:

@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
    Layer<CocosNodeOpacity> * content;
}

No entanto, isso não evita que você precise definir os métodos de opacidade na sua classe de camada. Usando o protocolo, você estabeleceu que sua classe terá essas funções, mas você não as forneceu. Você ainda precisará escrever o código para eles.

Eu acho que o que você está procurando é uma categoria Objective-C. Uma categoria fornece uma maneira de estender a funcionalidade de qualquer classe adicionando métodos a ela em tempo de execução. Eles são possíveis porque o Objective-C é uma linguagem completamente dinâmica. Se você não é o autor da classe de camada e não pode adicionar facilmente os métodos de opacidade, uma categoria é o caminho a percorrer. Em alguns casos, as categorias são extremamente úteis - você pode adicionar métodos às classes internas, como NSString e NSColor, sem a fonte de classe existente.

Há muita documentação para categorias aqui no Stack Overflow. Os documentos da Apple também são muito bons. Aqui está um artigo para você começar:

http://macdeveloptips.com/obndive-c/objective-c-categories.html

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