Conozco Java, y ahora estoy aprendiendo Objective-C. ¿Cuáles son exactamente las diferencias entre las interfaces Java y los protocolos Objective-C?Diferencias entre las interfaces Java y los protocolos Objective-C?
Respuesta
En primer lugar, un pequeño historical perspective on the topic, de uno de los creadores de Java. A continuación, Wikipedia tiene un section on Objective-C protocols moderadamente útil. En particular, entienda que Objective-C admite protocolos formales (que se declaran explícitamente con la palabra clave @protocol
, el equivalente de una interfaz Java) y protocolos informales (solo uno o más métodos implementados por una clase, que pueden ser descubierto a través de la reflexión).
Si adopta un protocolo formal (terminología de Objective-C para "implementar una interfaz") el compilador emitirá advertencias para los métodos no implementados, tal como se esperaría en Java. A diferencia de Java (como skaffman mencionado), si una clase Objective-C implementa los métodos contenidos en un protocolo formal, se dice que "se ajusta" a ese protocolo, incluso si su interfaz no lo adopta explícitamente. Para probar la conformidad de protocolo en el código (usando -conformsToProtocol:) así:
if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
...
}
NOTA: documentation estados de Apple:
"Este método determina la conformidad únicamente sobre la base de las declaraciones formales en los archivos de cabecera , como se ilustra arriba, no comprueba si los métodos declarados en el protocolo se implementan realmente, esa es la responsabilidad del programador ".
Como de Objective-C 2.0 (en OS X 10.5 "Leopard" y el IOS), protocolos formales ahora pueden definir métodos opcionales, y una clase se ajusta a un protocolo tal de que implementa todos los métodos requeridos . Puede usar las palabras clave @required
(predeterminado) y @optional
para alternar si las declaraciones de método que siguen a deben o pueden implementarse para cumplir con el protocolo. (Consulte la sección de la guía Objective-C 2.0 Programming Language de Apple que trata sobre optional protocol methods.)
conocer los protocolos opcionales abren una gran flexibilidad a los desarrolladores, en particular para la implementación de delegados y oyentes. En lugar de extender algo como un MouseInputAdapter (que puede ser molesto, ya que Java también es de herencia única) o implementar muchos métodos inútiles y vacíos, puede adoptar un protocolo e implementar solo los métodos opcionales que le interesan. Con este patrón, la persona que llama comprueba si el método se lleva a cabo antes de invocar (usando -respondsToSelector) de esta manera:
if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
[myObject fillArray:anArray withObject:foo];
...
}
Si la sobrecarga de reflexión se convierte en un problema, siempre se puede cache the boolean result for reuse, pero resista la tentación de optimizar prematuramente . :-)
Son casi idénticos. Sin embargo, lo único que me ha sorprendido es que, a menos que declare explícitamente que un protocolo Object C también implementa NSObject, las referencias a ese protocolo no tienen acceso a los métodos que declara NSObject (sin una advertencia de compilador de todos modos). Con java puede tener una referencia a una interfaz, y todavía llamar a String(), etc. en él.
por ejemplo
Objetivo C:
@protocol MyProtocol
// Protocol definition
@end
id <MyProtocol> myProtocol;
[myProtocol retain] // Compiler warning
Java:
public interface MyInterface {
// interface definition
}
MyInterface myInterface;
myInterface.toString(); // Works fine.
Objetivo C (fijo):
@protocol MyProtocol <NSObject>
// Protocol definition
@end
id <MyProtocol> myProtocol;
[myProtocol retain] // No Warning
Esto se debe a que id y NSObject * no son lo mismo *. En Java, el objeto raíz es Object. En Objective-C, NSObject es un objeto raíz, pero no * el * objeto raíz. Si desea acceder a todos los métodos de NSObject (métodos de clase y protocolos), explíquelo explícitamente: NSObject
@JasonCoco cool: D – hqt
- 1. ¿Cuáles son las diferencias entre java 1.5 y java 1.6
- 2. Diferencia entre los protocolos FIX y FAST?
- 3. Las diferencias entre TCP y Retroceso N
- 4. ¿Cuáles son las similitudes y diferencias entre las anotaciones Java y los atributos C#?
- 5. Diferencias entre Java y C# y .NET
- 6. ¿Cuáles son las diferencias entre PHP y Java?
- 7. ¿Cuáles son las diferencias entre LLVM y bytecode java?
- 8. ¿Cuáles son las diferencias fundamentales entre OSGi y Java EE?
- 9. Las diferencias entre C# asíncrono y Java ExecutorService
- 10. Cuáles son las diferencias en JIT entre Java y .Net
- 11. Diferencias entre Camel y BPEL
- 12. ¿Cuáles son las diferencias entre los modelos CSS y Latex?
- 13. ¿Cuáles son las diferencias entre la implementación de interfaces en Delphi y Lazarus (FPC)?
- 14. ¿Cuáles son las diferencias entre $ {} y # {}?
- 15. diferencias sutiles entre oop java y php
- 16. Diferencias entre JDK y Java SDK
- 17. Diferencias entre Excepción y Error
- 18. Las diferencias entre la función y document.ready $
- 19. Las diferencias entre tenedor y exec
- 20. Lista completa de protocolos/interfaces de Python
- 21. Diferencia entre los protocolos de Clojure y las categorías de Groovy
- 22. Bloques ObjectiveC equivalente en Java
- 23. Diferencias entre Ant y Maven
- 24. ¿Cuáles son las diferencias entre los caracteres literales '\ n' y '\ r' en Java?
- 25. Diferencias entre las opciones classpath y sourcepath de javac
- 26. ¿Influencia de los protocolos de Clojure?
- 27. * Sutil * ¿Diferencias entre las funciones VB y las funciones Convert.To *?
- 28. MATLAB: Las diferencias entre las versiones .mat
- 29. ¿Hay diferencias entre "y"
- 30. ¿Cuáles son las diferencias entre JSP, PHP, HTML5 y javascript?
"Si adopta un protocolo formal (terminología de Objective-C para" implementar una interfaz ") el compilador emitirá advertencias para los métodos no implementados, tal como se esperaría en Java". Java emitiría un error en este caso, no una advertencia. –
"si una clase Objective-C implementa los métodos contenidos en un protocolo formal, se dice que se" ajusta "a ese protocolo, incluso si su interfaz no lo adopta explícitamente. Puede probar la conformidad del protocolo en el código (utilizando -conformToProtocol :) como este "Esto es FALSO. '-conformsToProtocol:' solo devolverá SÍ si la clase adopta explícitamente el protocolo. ¿Lo has intentado? – user102008
Tiene razón, '-conformsToProtocol:' de hecho requiere que la clase (o un ancestro) declare formalmente que adopta el protocolo. No estoy seguro de cómo me equivoqué, ¡gracias por la corrección! –