Pregunta

Me gustaría que un objeto variable de instancia adopte un protocolo.

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

Por ejemplo, me gustaría que mi objeto Layer adoptara el <CocosNodeOpacity> para poder obtener los métodos

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

gratis. La sintaxis que se muestra arriba no es válida. ¿Es posible lograr esto sin crear un nuevo archivo de implementación y crear un objeto personalizado? Gracias.

¿Fue útil?

Solución

Si todos estos son códigos que creó, la mejor manera de hacerlo es probablemente hacer que la clase Layer adopte el protocolo, en lugar de la variable.

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

Un beneficio clave de este enfoque es que el compilador verificará si ha implementado todos los métodos requeridos en el protocolo en el momento de la compilación, que generalmente es lo que desea. Agregar los métodos en el mismo lugar que el resto de la implementación de la clase estándar es más fácil de entender (no es necesario buscar de dónde proviene el código mágico) y menos frágil que usar categorías (agregar el mismo método a través de diferentes categorías puede generar un comportamiento indefinido) . Como regla general, solo uso categorías cuando tengo , como agregar métodos al código de terceros (de código cerrado).

Si no controla la fuente de id, puede que tenga que usar esto cuando declare su ivar:

Layer<CocosNodeOpacity> *content;

Tenga en cuenta que la adopción de un protocolo le permite escribir estáticamente variables con un tipo de clase y obtener advertencias de compilación si los métodos no están presentes. Sin embargo, no obtiene los métodos & Quot; gratis & Quot ;, ya que todavía tiene que implementarlos. Aún así, el uso juicioso de los protocolos y la escritura estática pueden hacer que su código sea más robusto y & Quot; fail-fast & Quot; que usar <=> como tipo para todo. Usted debe ser elogiado por no solo tomar la salida fácil. :-)

Para obtener algunos detalles sobre los protocolos (incluidos los métodos obligatorios y opcionales), consulte esta respuesta SO .

Otros consejos

Un protocolo en Objective-C es similar a una interfaz en Java. El protocolo define un conjunto de funciones y actúa como un contrato. Es como decir & Quot; Te garantizo que sea lo que sea este objeto, tiene estos métodos. & Quot;

Estás bastante cerca de la sintaxis en tu primer bloque de código. En realidad, se vería así:

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

Sin embargo, eso no le ahorra tener que definir los métodos de opacidad en su clase de capa. Usando el protocolo, ha establecido que su clase tendrá esas funciones, pero en realidad no las ha proporcionado. Aún deberá escribir el código para ellos.

Creo que lo que estás buscando es una categoría de Objective-C. Una categoría proporciona una manera de extender la funcionalidad de cualquier clase al agregarle métodos en tiempo de ejecución. Son posibles porque Objective-C es un lenguaje completamente dinámico. Si no es el autor de la clase Layer y no puede agregarle fácilmente los métodos de opacidad, una categoría es el camino a seguir. En algunos casos, las categorías son extremadamente útiles: puede agregar métodos a las clases integradas, como NSString y NSColor, sin tener la fuente de clase existente.

Aquí hay mucha documentación para categorías sobre desbordamiento de pila. Los documentos de Apple también son muy buenos. Aquí hay un artículo para comenzar:

http://macdevelopertips.com/objective-c/objective-c -categories.html

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