No estoy muy confundido acerca de algunos conceptos sobre los protocolos y categorías de Objective-C.¿Se pueden heredar los protocolos y las categorías de Objective-C?
¿Se pueden heredar los protocolos y las categorías por subclases en Objective-C?
No estoy muy confundido acerca de algunos conceptos sobre los protocolos y categorías de Objective-C.¿Se pueden heredar los protocolos y las categorías de Objective-C?
¿Se pueden heredar los protocolos y las categorías por subclases en Objective-C?
Las categorías son colecciones de métodos que se agregan a una clase en tiempo de ejecución. Dado que Objective-C utiliza el enlace dinámico, esto significa que los métodos definidos en una categoría están disponibles para la clase y todas sus subclases. Específicamente, los selectores están vinculados a los métodos en el punto donde se invocan, no durante la compilación o cuando el programa se carga por primera vez. Las categorías se agregan a las clases cuando se cargan (las categorías).
Los protocolos definen colecciones de firmas de métodos que las clases que se les aplican prometen implementar. Una vez que una clase ha declarado que se ajusta a un protocolo, los métodos se declaran en la interfaz de esa clase y las reglas de herencia son exactamente las mismas: las subclases heredan la declaración y la implementación de los métodos de protocolo, pero también pueden elegir anular la superclase implementación.
Los protocolos mismos se pueden ampliar para producir nuevos protocolos. consistente en un superconjunto de los métodos en el protocolo original. De hecho, así como la mayoría de las clases heredan de la clase NSObject
, la mayoría de los protocolos extienden el protocolo NSObject
(los nombres de los protocolos y los nombres de las clases se encuentran en diferentes espacios de nombre). Esto es para que los objetos declarados como id<WhateverProtocol>
se puedan enviar mensajes básicos como -retain
, -release
y así sucesivamente sin generar advertencias del compilador.
Las categorías son como una extensión de una clase. Puede agregar sus propios métodos a otras clases (como NSString o cualquier otra cosa). Lo que significa que cualquier subclase también obtiene los métodos.
Considerando que un protocolo es una lista de métodos que requiere la clase que le confirma implementarlo todo (a menos que utilice la etiqueta @optional). Entonces no tiene sentido que sea una subclase para heredarlo.
Editar:
Para la implementación del protocolo, me di cuenta que no era lo suficientemente clara. Los métodos de protocolo que se implementaron en su superclase pueden ser heredados, sin embargo, lo que quise decir es que generalmente no es necesario que anule el método de protocolo de su superclase.
Más específicamente: una la subclase hereda la conformidad del protocolo de su padre. Entonces, si una clase se ajusta a
Sí, eso es lo que estaba diciendo. Gracias. – TheAmateurProgrammer
Su pregunta no está clara. Es posible que se pregunte si las subclases heredan los protocolos y las categorías de su superclase. @theAmateurProgrammer ha respondido esto.
También es posible que se pregunte si las categorías y los protocolos pueden heredarse de otras categorías y protocolos. Para las categorías, la respuesta es no. Para los protocolos, la respuesta es sí, y de hecho protocolos casi siempre debe heredar al igual que las clases de este tipo:
@protocol SomeProtocol <NSObject>
...
@end
Este dice que cualquier cosa que se ajusta a <SomeProtocol>
también se ajusta a <NSObject>
(que es un protocolo, así como una clase). Esto le permite llamar a métodos como respondsToSelector:
, que es muy importante para la mayoría de las implementaciones de protocolos.
la mitad de esta respuesta es un comentario sobre la pregunta original. Por otro lado, respondió mi pregunta para hoy, así que +1. Gracias. –
Los protocolos son como interfaces en Java. Entonces, una clase proporciona un protocolo para acceder a ella.
Puede "subclasificar" protocolos al igual que en Java puede "subclase" interfaces.
Las categorías, por otro lado, son una forma de agregar más métodos a una clase. La restricción es que no puede agregar ninguna variable de instancia con una categoría. Solo puede acceder a las variables de instancia existentes.
Sin embargo, es muy útil porque evita crear una gran jerarquía de subclase frágil.
Por lo tanto, en conclusión, si desea ver diferentes clases para ajustarse a una interfaz estándar, utilice un protocolo. Si desea agregar algunos métodos a una clase existente sin la molestia de crear subclases, vaya a una categoría.
Sin embargo, una cosa a tener en cuenta es que cuando agrega métodos a una categoría, algo que me han recordado los compañeros de trabajo, es que está haciendo que esos métodos estén disponibles en todas partes. He leído en algunos lugares que un error común de principiante es volverse loco con las categorías, usándolas todo el tiempo en lugar de crear nuevas clases que harían el trabajo.
Por lo tanto, si el nuevo método de categoría que está considerando es realmente específico o, mejor dicho, estrechamente acoplado a una función comercial, probablemente no sea una categoría. Realmente solo deberían usarse para adiciones genéricas a la clase base.
NSObject conforma al protocolo de NSObject
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
Digamos que tenemos una subclase de NSObject
@interface FTGAnimal : NSObject
@end
@implementation FTGAnimal
@end
Podemos ver que FTGAnimal realidad conforma al protocolo de NSObject
if ([FTGAnimal conformsToProtocol:@protocol(NSObject)]) {
NSLog(@"FTGAnimal conforms to NSObject protocol");
}
+1 por mencionar el tiempo de ejecución 'obj-C' –
El ejemplo más popular sería: @protocol UITableViewDelegate. –