Video: Como usar el app "X Air Q" 2024
Un protocolo define conjuntos de métodos que cualquier clase puede implementar. Piense en los protocolos como interfaces de definición que las clases deben implementar. Los protocolos se utilizan a menudo para especificar la interfaz para los objetos delegados.
Con la característica de protocolo, puede evitar tener que forzar la creación de subclases para crear clases polimórficas. Objective-C (a diferencia de C ++) no permite que una clase tenga múltiples superclases. Los protocolos, por lo tanto, son una característica esencial en Objective-C porque no permite la herencia múltiple.
Cuando una clase implementa los métodos en un protocolo, se dice que la clase es conforme al protocolo.
La definición de un protocolo es similar a la definición de una interfaz para una clase. Sin embargo, un protocolo no tiene una clase padre o variables de instancia. Aquí hay un ejemplo de definición de protocolo (Imprimible) del programa calculador de postfix:
@protocol Printable - (void) printMe; // Puedo omitir @required, ya que es el @optional predeterminado (NSString *) printMeToString; -d
Con la llegada (y de hecho con gran fanfarria) de Objective-C 2. 0, los métodos de protocolo pueden ser necesarios (por defecto) u opcionales.
Aquí está la declaración de StackOfInteger que establece que implementará el protocolo: @interface StackOfInteger: NSObject … -d
Aquí está la implementación del protocolo en la clase StackOfInteger:
@implementation StackOfInteger; … Otros métodos StackOfInteger … /////////// Métodos para implementar el protocolo imprimible //////////// - (void) printMe {int k, stackCount = [count de elementos]; NSLog (@ "Stack-> Last>% dlast); for (k = 0; k% @Observe que el método printMeToString no está implementado porque es opcional.
< ! --1 -> Un programa puede probar si un objeto se ajusta a un protocolo. El siguiente código incluye ejemplos de esta prueba (tomados del programa principal de la muestra):
printf ("Prueba de conformidad con protocolsn "); if ([myStack se ajusta a Protocolo: @protocol (Imprimible)]) {printf (" Usando métodos de protocolo "); [myStack printMe];} else {NSLog (@" El objeto no cumple con el protocolo% @ n ", @protocol (Imprimible));} id someObject = [[PostfixCalculator alloc] initWithExpression: @ "44 55 *"]; if (! [someObject conformsToProtocol: @protocol (Printable)]) {NSLog (@ "El objeto no cumple con protocol ");}Debido a que el objeto myStack se ajusta al protocolo, se invocan sus métodos printMe y printMeToString. Como someObject (que es id. de tipo para dar más sentido al ejemplo) no cumple con el protocolo imprimible, la prueba porque la conformidad falla.
También puede probar la existencia de un método opcional utilizando el método respondsToSelector.
Puede hacer que una clase adopte un protocolo simplemente implementando los métodos definidos por ese protocolo. Es decir, no tiene que declarar el protocolo en su interfaz. Sin embargo, aunque la clase implementa los métodos de protocolos, será no conforme al protocolo y fallará la prueba de conformidad anterior.