2009-03-20 7 views
5

Veo una gran cantidad de código como el siguiente en los últimos tiempos:¿Cómo funciona un protocolo en una variable de instancia en Objective-C?

id<foo> aBar; 

Normalmente esto es algo que vería en una declaración de la clase, tales como:

@interface bar : UIViewController <UITableViewDelegate, UITableViewDataSource> 

¿La media superior que aBar podría ser una instancia de la barra de clases y promete tener todos los métodos declarados en el protocolo foo?

Respuesta

16

Cerrar. Significa que aBar será una instancia de una clase que se ajuste al protocolo foo. Podría ser bar (si esa clase se ajusta a foo) u otra clase que cumpla con foo. Todo lo que sabe de esa declaración es que aBar cumple con el protocolo.

Además, estos solo se controlan en tiempo de compilación, no en tiempo de ejecución. Es posible poner un objeto en aBar que no sea una instancia de una clase que cumpla con foo. Pero el compilador te lo advertirá en la mayoría de los casos.

+0

Cree que puede haber algún intercambio 'foo' y 'barra' en la pregunta y respuesta. Su clase 'bar' no adopta el protocolo foo, por lo que el compilador se quejaría de almacenar una instancia de 'bar' en 'aBar' tal como está escrito. –

+0

No creo que haya ningún intercambio, pero tiene razón acerca de que la clase de barra no se ajusta al protocolo foo. Creo que su último párrafo explica por qué lo escribió de esa manera, sin embargo. –

0

Exactamente. Los protocolos significan que no heredas la clase, sino que obtienes los prototipos del método de esa clase. De esta forma sabrá cuáles son los apéndices de método cuando intente interactuar con un objeto que requiera esos métodos. Piense en una interfaz poco profunda en C#.

Digo C# porque ese es mi idioma principal. :)

Cuestiones relacionadas