2011-05-23 11 views
16

He leído un montón de artículos y lecturas sobre delegados de Objective-C, tratando de entenderlos. Viniendo de Java, se parecen mucho a los oyentes de Java. Por ejemplo, supongamos que tengo un botón en Java. Cuando se presiona el botón, quiero que pase algo. Mi código podría ser algo como esto:Delegados de Objective-C vs oyentes de Java

ButtonListener myButtonListener = new ButtonListener();  
someButton.addActionListener(myButtonListener); 
... 

class ButtonListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 

    } 
} 

Algo por el estilo. En Object-c parece que haría algo como llamar a un método setDelegate para mi botón y pasarle el "oyente" como delegado. La clase de botón real probablemente verifique si ese delegado respondió a algún selector (es decir, actionPerformed). Si estoy pensando en esto de la manera correcta, parece que los delegados son como oyentes. ¿Es eso correcto? ¿Hay alguna diferencia importante?

Gracias!

Respuesta

10

Estás casi allí en el botón. La única diferencia real es que los delegados en obj-c generalmente implementan múltiples funciones para realizar diversas acciones en eventos con respecto al objeto que están delegando. Por ejemplo, el UITextViewDelegate tiene los métodos:

– textViewShouldBeginEditing: 
– textViewDidBeginEditing: 
– textViewShouldEndEditing: 
– textViewDidEndEditing: 

La única diferencia real que he encontrado es que no se puede crear sus delegados en línea, la forma en que puedas en Java como:

someButton.setOnClickListener (new View.OnClickListener { 
    @Override 
    public void onClick() { 
     //do stuff 
    } 
}); 
+3

Técnicamente, usando bloques, puede hacer delegados en línea. Tengo una clase de utilidad para esto en algún lugar de mi disco duro ... –

+0

Oh, realmente estaba buscando algo así en una aplicación en la que estaba trabajando para evitar tener que crear una clase completamente nueva solo para una función de delegado. Me encantaría ver cómo lo haces –

+1

Aquí tienes: Encabezado: http://pastebin.com/Gdg4nsAF Principal: http://pastebin.com/SGVGCB31. Tendrá que hacer una clase por cada delegado, pero cuando necesite muchos de ellos, esto ayudará a mantener baja la cantidad de clases. –

7

que son similares, pero no idénticos. un patrón de delegación tiene una definición más amplia y, a menudo, tareas de implementación definidas que pueden ir más allá de la simple escucha. las tareas pueden incluir escuchar, o la implementación del delegado se puede definir como escuchar (exclusivamente).

Los delegados objc a menudo se usan para evitar la creación de subclases y para servir como oyentes o proveedores de datos. lo que hace un delegado lo define el protocolo; puede servir mucho más que un oyente. por lo que un delegado podría ser una fuente de datos/proveedor. es solo un medio para descargar la implementación a otra clase, para eliminar de la clase lo que a menudo se personaliza, la implementación específica de la aplicación.

NSButton/UIButton ya se ha especializado en este caso a través de mecanismos de acción + target. usaría la acción target + para este caso específico.

0

Creo que se encontraría un mejor análogo de Java para los delegados .NET en el pagkage java.util.concurrent: Callable, Future, Executor.

1

Delegado es similar como oyente o observador, el protocolo es similar a la interfaz, excepto que el protocolo puede definir funciones opcionales (también conocido como mensajes). En Objective C, puede aumentar una clase existente (sin su código fuente) utilizando categoría para adoptar un protocolo y convertirlo en delegado, de modo que no necesite crear nuevas clases internas anónimas. No puedes hacer eso en Java.