2010-03-04 15 views

Respuesta

3

Las "Categorías" le permiten agregar métodos, pero no variables de miembro, a las clases existentes.

Consulte la sección de este tutorial sobre ellas (busque en la página): http://cocoadevcentral.com/d/learn_objectivec/ O busque Categorías en Objective-C en cualquier otro lugar.

No se pueden agregar vars de instancia sin subclases.

+1

Puede agregar algo similar a variables de instancia mediante referencias asociativas (como señala Laurent). – bbum

0

Puede agregar métodos miembro a una clase sin crear subclases creando una categoría, pero esto no le permitirá agregar variables miembro.

Aunque se pueden hacer muchas cosas en tiempo de ejecución en objetivo-c que no se pueden hacer en otros idiomas (ver runtime reference) Realmente no recomendaría este hacker para agregar una variable de instancia a una clase existente.

¿Te importaría explicar el motivo por el que no quieres hacer una subclase? Una subclase o categoría realmente parece ser lo mejor que se puede hacer.

6

Para métodos: puede usar categories para agregar métodos de miembros sin crear subclases. Es una práctica bastante común en Cocoa, agregar métodos de extensiones por marco.

Variables de ejemplo: comenzando con Snow Leopard (Mac OS X 10.6), puede usar associative references. Los usa para simular la adición de variables de instancia de objeto a una clase existente.

El Objective-C Programming Language es bastante completo sobre lo que puede hacer con referencias y categorías asociativas.

1

No puede. A veces es una mala idea subclasificar (tal vez estás trabajando con un clúster de clase, por ejemplo), por lo que las personas a menudo trabajan en esto creando una nueva clase (una subclase de NSObject, no de la clase en cuestión) que contiene un variable de instancia cuyo tipo es la clase en cuestión, así como las variables adicionales deseadas.

Por ejemplo, si desea crear una subclase de NSString con un BOOL adicional llamado "foo" ...

@interface StringWithFoo : NSObject 
{ 
    NSString* string; 
    BOOL foo; 
} 

... y luego poner en práctica los métodos que necesita, o cree un descriptor de acceso público por lo que puede llamar directamente a los métodos en la cadena, o incluso utilizar engaños de tiempo de ejecución sofisticados para reenviar los mensajes de manera apropiada (haga una nueva pregunta si eso es lo que quiere hacer).

Esto es, en líneas generales, un ejemplo del decorator pattern.

Cuestiones relacionadas