2011-08-21 15 views
67

Las extensiones de clase @interface Class() son mucho más potentes y pueden insertar variables en la clase. Categorías @interface Class (Category) no pueden.Extensión de clase frente a la categoría de clase

¿Qué otras diferencias existen, y cuándo se debe usar una categoría sobre una extensión de clase?

+0

categorías son código real. son cómo agregar funciones a una clase. las extensiones son (en términos muy generales) más solo azúcar sintáctica, para señalar ciertas ideas sobre privacidad, etc., a otros programadores. las extensiones no contienen código y no son código. – Fattie

+0

Para extensiones como se usan en Swift, vea esta pregunta: http://stackoverflow.com/questions/24142829/how-to-create-swift-class-for-category – Suragch

Respuesta

77

La diferencia principal es que con una extensión, el compilador esperará que implemente los métodos dentro de su @implementation principal, mientras que con una categoría tiene un bloque @implementation separado. Así que debería usar una extensión en la parte superior de su archivo principal .m (el único lugar en el que debería preocuparse por los ivars, por cierto), sino que es exactamente eso, una extensión .

+3

Pero, entonces, ¿qué sentido tiene usar la extensión sobre ¿categoría? – David

+32

Una extensión es mejor para los métodos privados que desea declarar en su archivo '.m'. Lo uso para esto todo el tiempo. Las categorías son más útiles cuando quiere agrupar sus métodos en diferentes secciones - * categorías * :) - o cuando quiere agregar código a las clases existentes que no creó. – jtbandes

+1

También puede agregar almacenamiento adicional con extensiones de clase utilizando propiedades. –

3

Las categorías son una característica del lenguaje Objective-C que le permite agregar nuevos métodos a una clase existente. Las extensiones son un caso especial de categorías que le permiten definir métodos que deben implementarse en el bloque de implementación principal.

Las declaraciones privadas pueden estar en extensiones de clase, que son principalmente algunas propiedades, porque no tenemos necesidad de declarar un método antes de llamarlo.

+0

"que debe declararse en el bloque de implementación principal". -> eso debe ser "implementado" en el bloque de implementación principal – Fawkes

+0

Gracias, lo he modificado. –

0

extensión ios similar a C#, clase abstracta o interfaz Java
categoría ios similar a c extensión # clase

+0

Java no es compatible con los métodos de extensión – someUser

+0

lo siento! Copiar y pegar un error tipográfico categoría ios similar a la extensión de la clase C#. – Add080bbA

15

Una extensión de clase guarda cierta similitud a una categoría, pero sólo puede ser añadido a una clase para la cual tiene el código fuente en tiempo de compilación (la clase se compila al mismo tiempo que la extensión de clase). Los métodos declarados por una extensión de clase se implementan en el bloque @implementation para la clase original, por lo que no puede, por ejemplo, declarar una extensión de clase en una clase de infraestructura, como una clase Cocoa o Cocoa Touch como NSString.

La sintaxis para declarar una extensión de clase es similar a la sintaxis de una categoría, y tiene el siguiente aspecto:

@interface ClassName() 
@end 

Debido a que ningún nombre se da entre paréntesis, las extensiones de clase a menudo se refieren a categorías como anónimos .

A diferencia de las categorías normales, una extensión de clase puede agregar sus propias propiedades y variables de instancia a una clase. Si se declara una propiedad en una extensión de clase, así:

@interface XYZAnimal() { 
    id _someCustomInstanceVariable; 
} 
... 
@end 

en mi humilde opinión, lo mejor es pensar en las extensiones de clase como interfaz privada a una clase. La interfaz principal (en su archivo .h) actúa como la interfaz pública que define el contrato de comportamiento de la clase con otras clases.

extensiones Uso de clase para ocultar información privada

extensiones de clase a menudo se utilizan para extender la interfaz pública con métodos privados adicionales o propiedades para su uso dentro de la implementación de la clase en sí. Es común, por ejemplo, definir una propiedad como readonly en la interfaz, pero como readwrite en una extensión de clase declarada arriba de la implementación, para que los métodos internos de la clase puedan cambiar el valor de la propiedad directamente.

Como ejemplo, la clase XYZPerson podría agregar una propiedad llamada uniqueIdentifier, diseñada para realizar un seguimiento de información como un número de seguridad social en los EE. UU.

Por lo general, requiere una gran cantidad de documentos para tener un identificador único asignado a un individuo en el mundo real, por lo que la interfaz de clase XYZPerson puede declarar esta propiedad como de solo lectura y proporcionar algún método que solicite un identificador asignado, como esto:

@interface XYZPerson : NSObject 
    ... 
    @property (readonly) NSString *uniqueIdentifier; 
    - (void)assignUniqueIdentifier; 
@end 

para que la clase XYZPerson para poder cambiar la propiedad internamente, que tiene sentido para redeclare la propiedad en una extensión de clase que se define en la parte superior del archivo de implementación para la clase:

@property (readwrite) NSString *uniqueIdentifier; 

Nota: El atributo readwrite es opcional, porque es el predeterminado. Es posible que desee utilizarlo al redeclar una propiedad, para mayor claridad.

-1

Las categorías son una forma de ampliar la API de las clases existentes, y las extensiones son una forma de agregar los métodos necesarios a la API fuera del archivo de interfaz principal. Ambos fueron diseñados inicialmente para aliviar la carga de mantener grandes bases de código.

Advertencias de utilizar Categoría:

1- No se puede reemplazar de forma fiable los métodos definidos en las categorías de la misma clase.

2- Una categoría no puede agregar variables de instancia. Esto significa que no puede declarar nuevas propiedades.

Referencia: Objective-C Succinctly: Categories and Extensions. Tiene una discusión detallada con ejemplos.

Cuestiones relacionadas