iphone - ¿Se pueden heredar los protocolos y categorías de Objective-C?
ios protocols (5)
Las categorías son colecciones de métodos que se agregan a una clase en tiempo de ejecución. Debido a que Objective-C usa un 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 en que 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 las conforman prometen implementar. Una vez que una clase ha declarado que se ajusta a un protocolo, es como si los métodos estuvieran declarados 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 del protocolo, pero también pueden optar por anular la superclase. implementación.
Los protocolos en sí pueden extenderse para producir nuevos protocolos. que consiste en un superconjunto de los métodos en el protocolo original. De hecho, al igual que la mayoría de las clases heredan de la clase NSObject
, la mayoría de los protocolos extienden el protocolo NSObject
(los nombres de protocolo y los nombres de clase están en espacios de nombres diferentes). Esto es así para que los objetos declarados como id<WhateverProtocol>
puedan enviarse mensajes básicos como -retain
, -retain
y así sucesivamente sin generar advertencias del compilador.
Estoy un poco confundido acerca de algunos conceptos en torno a los protocolos y categorías de Objective-C.
¿Los protocolos y categorías pueden ser heredados por subclases en Objective-C?
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 obtiene los métodos también.
Mientras que un protocolo es una lista de métodos que requiere la clase que lo confirma para implementarlo todo (a menos que use la etiqueta @optional). Así que no hay ningún punto de su subclase para heredarlo.
Editar:
Para la implementación del protocolo, me di cuenta de que no estaba lo suficientemente claro. 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 anular el método de protocolo de su superclase.
Los protocolos son como interfaces en Java. Por lo tanto, 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 se puede acceder a las variables de instancia existentes.
Sin embargo, es muy útil porque evita la creación de una gran jerarquía de subclases frágiles.
Entonces, la conclusión es que, si desea que una vista de diferentes clases se ajuste a una interfaz estándar, entonces use 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 mis 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, usarlas todo el tiempo en lugar de crear nuevas clases que hagan el trabajo.
Entonces, si el nuevo método de categoría que está considerando es realmente específico o, mejor dicho, unido a una función empresarial, entonces probablemente no debería ser una categoría. Realmente solo deberían usarse para adiciones genéricas a la clase base.
NSObject se ajusta al protocolo 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 realmente cumple con el protocolo NSObject
if ([FTGAnimal conformsToProtocol:@protocol(NSObject)]) {
NSLog(@"FTGAnimal conforms to NSObject protocol");
}
Tu pregunta no está clara. Puede preguntarse si las subclases heredan los protocolos y las categorías de su superclase. @theAmateurProgrammer ha respondido esto.
También puede preguntar 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, los protocolos casi siempre deben heredar como clases como esta:
@protocol SomeProtocol <NSObject>
...
@end
Esto dice que todo lo que se ajuste a <SomeProtocol>
también se ajusta a <NSObject>
(que es un protocolo y una clase). Esto le permite llamar a métodos como respondsToSelector:
que es muy importante para la mayoría de las implementaciones de protocolos.