Un delegado (que significa representante) es un objeto de clase (que también quiere representar (heredar)) otra clase no relacionada.El objeto delegado puede heredar de una clase no relacionada de otra manera "conformándose a" (teniendo algunas implementaciones) los métodos de protocolo requeridos de la clase no relacionada, que indican a la clase extranjera que este objeto ahora puede volcar su información más básica apropiadamente.
Se utilizan herencia cuando se quiere relacionados clases para compartir métodos. Utiliza delegados cuando desee clases no relacionadas para compartir métodos. El enfoque de delegado permite que un objeto de una clase herede métodos de una clase no relacionada de otra manera. El "objeto delegado" u "objeto representativo" es el objeto que hereda de una clase extranjera; se designa como un representante, un delegado, de esa clase remota, de modo que cuando se asigna un objeto como delegado a una clase, también le está dando permiso para representar esa clase, aunque normalmente no hereda de esa clase . (Si heredó de la clase, entonces no necesitaría establecerlo como un delegado de esa clase, ya tendría acceso a los métodos de la clase. Pero desea que este objeto no relacionado herede algunos métodos de la clase, representando eso clase, y devolver alguna información a su clase de remitente, por lo que lo convierte en un delegado representante de esa clase, aunque hereda de un conjunto diferente de clases.) Esto esencialmente permite que una clase no relacionada herede de otra clase no relacionada, pero con una mínimo de complicaciones a su línea básica de herencia.
Utiliza el sistema de delegado cuando desea que un objeto ejecute código de una clase separada. Por ejemplo, as described here, cuando presiona Intro en un campo de texto, el campo de texto realmente no sabe qué hacer con esa información. Lo que hace es mirar a la clase de su objeto delegado (como el controlador de ventana del documento o el documento) y utiliza el método relevante de esa clase que se ajusta al método respectivo del campo de texto encontrado dentro de su protocolo delegado de campo de texto, algo así como textFieldShouldReturn. Entonces, en este caso, configura el controlador de ventana o el documento como el delegado del campo de texto, porque el campo de texto necesita esa clase para representar la información que se le dio.
Clase A necesita un método de Clase B, Clase A, pero no hereda de la clase B. En primer lugar, decirle al compilador que la Clase A cumple con el protocolo de Clase B:
@interface ClassA : NSObject <ClassBDelegateProtocol>
en la documentación de Apple, cada referencia de clase muestra en la parte superior, "Hereda de" y "Cumple con". Por ejemplo, NSDocumentController
hereda de NSObject
y se ajusta a NSUserInterfaceValidations
, NSCoding
y NSObject(NSObject)
. La conformidad a NSCoding
es de la declaración de interfaz en NSDocumentController.h
@interface NSDocumentController : NSObject <NSCoding>
y para NSUserInterfaceValidations
de la declaración del método en NSDocumentController.h
-(BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item;
junto con el #import
#import <AppKit/NSUserInterfaceValidation.h>
Así mientras que NSDocumentController
hereda de NSObject
, también necesita ayuda delNSCoding
y NSUserInterfaceValidation
. Y obtiene ayuda de estas clases extranjeras por según sus métodos de protocolo, definiéndose a sí mismo como conforme a los métodos y importando los archivos de encabezado necesarios para usar esos métodos.
Tuve un momento difícil con esto cuando comencé a mirar a Cocoa. No estas solo. – jergason