@interface y @protocol explicación?

82

Me gustaría saber cuál es la @interface en el objetivo C? ¿Es justo donde el programador quiere declarar las variables, el nombre de la clase o los nombres de los métodos ...? No estoy seguro de si es como una interfaz en Java. Y sobre el @protocolo en el objetivo C también. Parece más la interfaz en Java. ¿Alguien podría darme una explicación detallada por favor? Realmente lo aprecio.

Balancín
fuente

Respuestas:

92

Una interfaz es donde se definen los atributos y operaciones de la clase. También debe establecer la implementación.

Un protocolo es como una interfaz para java.

p.ej

@protocol Printing
    -(void) print;
@end

puede ser implementado

declarando (confusamente en la interfaz)

@interface Fraction: NSObject <Printing, NSCopying> {
//etc..

Lo confuso para los desarrolladores de Java es que las llaves {}no son el final de la interfaz, por ejemplo

@interface Forwarder : Object
{
    id recipient; 
} //This is not the end of the interface - just the operations


- (id) recipient;
- (id) setRecipient:(id) _recipient; 
//these are attributes.

@end
//This is the end of the interface
Johnno Nolan
fuente
10
En general, una explicación bastante buena, pero parece algo sesgado en cuanto a que Java lo hace de la manera "mejor". Como ocurre con tantas cosas, la terminología es relativa al idioma. Es útil recordar que Objective-C es anterior a Java, y Java se basó bastante en él, incluido el concepto de interfaces de protocolos. virtualschool.edu/objectivec/influenceOnJava.html Podría decirse que habría sido menos confuso si Java hubiera conservado el mismo nombre, pero no lo hizo porque Java no tiene un archivo .h separado que (en C / C ++) contiene el " interfaz "para una unidad de compilación.
Quinn Taylor
22
@QuinnTaylor No quería decir 'Java lo hace mejor', pero lo expresé de esa manera cuando el OP hizo la pregunta en relación con el lenguaje Java.
Johnno Nolan
2
Desde el punto de vista del Objetivo C únicamente, ¿cuál es la diferencia entre los dos? Ambos parecen imponer que ciertos métodos sean implementados por las clases que se forman en base a ellos. ¿La única diferencia es que los protocolos no tienen clase, por así decirlo, mientras que las interfaces deben implementarse?
SexyBeast
Creo que la parte deshonesta es que el protocolo no es una clase abstracta, sino más bien como COM dispinterface. Cada objeto smalltalk recibe un mensaje no a través de .xo .y como en los objetos c ++ (análogo ac myObject.lpVtbl->x(&myObject)) sino a través de una interfaz dual, análoga a c myObject.lpVtbl->Invoke(&myObject, "x", &argArray);. Debido a esto, los protocolos y las interfaces parecen servir para proporcionar al compilador información para generar tiempo de ejecución y verificación de tipo en tiempo de compilación. Por lo tanto, no hay un verdadero paralelo en C ++ a menos que introduzca un motor de secuencia de comandos / COM en su proyecto.
Dmitry
28

probablemente bueno si echas un vistazo a esto + Pensé que era de gran ayuda entender

Del artículo:

@interfaz

C ++

Foo.h

#ifndef __FOO_H__
#define __FOO_H__
class Foo
{
...
};

Foo.cpp

#include "Foo.h"
...

C objetivo

Foo.h

@interface Foo : NSObject
{
...
}
@end

Foo.m

#import "Foo.h"

@implementation Foo
...
@end

@protocolo

C ++

struct MyInterface
{
  void foo() = 0;
}

class A : MyInterface
{
public:
  void override foo() { ... }
}

C objetivo

@protocol MyInterface
-(void) foo;
@end

@interface Foo : NSObject <MyInterface>
{
 -(void) foo {...}
...
}
@end
AndersK
fuente
2
+1 Gran recurso. Prácticamente todos los programadores de C / C ++ son la guía de referencia al ingresar al reino de Objective-C.
KillAWatt1705
Acerca del ejemplo anterior @protocoldefine algunos métodos generales, @interfacedefine algunos métodos personalizados e @implementationimplementa esa interfaz. @interfaceno tiene ninguna implementación. Además, si el foométodo es el mismo que el del protocolo, no debe repetirse en la interfaz.
SMMousavi
Vaya, desearía haber encontrado ese artículo antes. Muy útil viniendo de C ++ a Obj. C, recomiendo encarecidamente a cualquier otra persona en esa posición que dedique tiempo a consultar el artículo vinculado en la respuesta.
user7804781
15

El @interfaceen Objective-C no tiene nada que ver con las interfaces Java. Simplemente declara una interfaz pública de una clase, su API pública. (Y variables miembro, como ya ha observado.) Las interfaces de estilo Java se denominan protocolos en Objective-C y se declaran mediante la @protocoldirectiva. Debería leer El lenguaje de programación Objective-C de Apple, es un buen libro, breve y muy accesible.

zoul
fuente