Protocolos en Objective-C

Desde que comencé a aprender Objective-C, siempre me pareció que el concepto de “Protocolo” era idéntico al de Interfaz de Java. Hoy, tras leer este artículo, comprendí que en realidad las Interfaces de Java están basadas en los Protocolos de Objective-C.

Cómo funcionan los protocolos en Objective-C?

Un protocolo nos permite definir una serie de mensajes a los que un objeto debe responder para decir que se “apega” al protocolo. El concepto es extremadamente similar al de Java, pero con un par de salvedades. Veamos un ejemplo práctico de cómo funcionan los protocolos en Objective-C.

Lo que haremos es definir un Protocolo “Hello” que requiere responder a un mensaje “sayHello”. Luego declararemos una clase que se apegue al Protocolo.

Archivo que define el Protocolo, hello.h:

@protocol Hello
- (void) sayHello;
@end

Implementación del Protocolo en una Clase HelloWorld.
Archivo: helloworld.h:

#import <Foundation/Foundation.h> //Solo en Mac!
#import <stdio.h>
#import "hello.h"

@interface Hello : NSObject <Hello>{
}

- (void)sayHello;

@end

Archivo helloworld.m:

#import "helloworld.h"

@implementation HelloWorld

- (void)sayHello
{
    printf("Hello, World!\n");
}

@end

Ahora incluiremos todo en un archivo main.m para probar el Protocolo:

#import "helloworld.h"

int main(int argc, char* argv[])
{
    id hello = [[HelloWorld alloc] init];

    [hello sayHello];

    [hello release];

    return 0;
}

Como se puede ver, los protocolos funcionan de manera muy similar a las Interfaces de Java.

Si se fijan con atención, en este último archivo, tras realizar la instanciación, nunca especifiqué que la variable hello responde al Protocolo Hello. El runtime de Objective-C se encargará de determinar si la instancia es capaz de responder al mensaje sayHello en tiempo de ejecución. Lo interesante aquí es que yo podría enviarle este mensaje incluso si el protocolo Hello no existiera. En cuyo caso estaríamos frente a lo que se denomina en la terminología de Objective-C un “Protocolo Informal”.

Un Protocolo Informal es como un Protocolo común, con la salvedad de que el Protocolo nunca es declarado formalmente, sino que es más bien una convención. Esta es la primer diferencia entre los Protocolos de Objective-C y las Interfaces de Java. En Java no es posible invocar un método de un objeto si el objeto no es de algún tipo que declare ese método.

La otra diferencia entre un Protocolo de Objective-C y una Interfaz de Java es que un Protocolo puede especificar mensajes “opcionales”. Estos no tienen que ser implementados obligatoriamente por las clases que adoptan el Protocolo.

Para declarar un mensaje opcional simplemente agregamos la keyword @optional “arriba” de los mensajes opcionales en el cabezal que define el Protocolo, por ejemplo:

//en algún lugar de hello.h:
    @optional
    - (void)sayGoodbye; //Goodbye es un método opcional del Protocolo

No me imaginé que el sentido de la “inspiración” hubiese sido desde Objective-C hacia Java, sino que pensaba lo contrario. Es interesante leer sobre los conceptos en los que se basan quienes definen los lenguajes, a veces nos llegan a sorprender.

This entry was posted in Objective-C, Programacion, Tutoriales. Bookmark the permalink.