2009-07-09 15 views
10

Estoy aprendiendo Objective-C en este momento y he encontrado métodos opcionales en Protocols. Mi fondo es C# y puedo ver un protocolo como algo similar a una interfaz C#.Ejemplos del mundo real de los métodos de protocolo @opcional

Cuando una interfaz de C# representa un contrato, al anunciar una interfaz está diciendo que implementará los métodos definidos.

Con esto en mente, estoy confundido sobre por qué alguna vez necesitaría definir un método opcional. Esto no es insulto o un intento de disminuir Objective-C, me encanta Objective-C. Simplemente quiero comprender los beneficios de estos métodos opcionales, a fin de obtener una mayor comprensión del idioma.

Realmente apreciaría si alguien pudiera proporcionar algunos escenarios del mundo real (con código de muestra) donde los métodos opcionales son útiles.

Respuesta

14

Le daré un ejemplo. Tengo varias clases de ObjC que hablan con la API de Flickr. Uno, llamado FKAccount, puede hacer muchas cosas relacionadas con la cuenta de un usuario de Flickr, incluida la descarga de las fotos del usuario, obtener su lista de contactos, etc.

La clase FKAccount define un protocolo delegado FKAccountDelegate. Este protocolo especifica una cantidad de métodos de devolución de llamada que FKAccount invocará en su delegado dependiendo del éxito o fracaso de varias operaciones de red en Flickr. No todas las aplicaciones que usan FKAccount estarán interesadas en cada operación de Flickr que FKAccount pueda realizar.

Si fuera necesario que todas las clases que pretenden implementar el protocolo FKAccountDelegate implementen todos los métodos, terminarían con muchos métodos de código auxiliar (FWIW, hay 41 métodos definidos en FKAccountDelegate). Cuando estos métodos se declaran @optional en el protocolo, el delegado solo necesita implementar las devoluciones de llamada que le interesa recibir.

Los FKAccount clase comprueba que su delegado responde a @optional métodos en el protocolo por:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

creo que me estoy haciendo ahora. Una interfaz C# es solo una faceta de un protocolo Objective-C. Puede usar un protocolo como un contrato, pero estos métodos opcionales constituyen una lista de delegados opcionales a los que un objeto también puede responder. Eso es realmente interesante. – kim3er

+1

+1 para usar un protocolo para documentar las funciones de delegado –

+1

Estoy totalmente de acuerdo con @Tom. Antes de Objective-C 2.0, los métodos delegados generalmente se declaraban en una categoría en NSObject para evitar que cualquier clase que desea ser delegado tenga que implementar todos los métodos. Los métodos opcionales en protocolos son una solución mucho más limpia que no ataca a toneladas de métodos en NSObject y ayuda a evitar colisiones de métodos. Si solo Java tuviera métodos de interfaz opcionales, no habría necesidad de cosas como heredar de MouseAdapter. Utilizar clases como esa son generalmente las pocas veces que he maldecido la herencia individual ... :-) –

Cuestiones relacionadas