2011-10-07 7 views
29

Me gustaría tener un patrón para una clase privada anidada en Objective C.clases privadas en Objective C

Los requisitos son:

  • clase no será visible/acceder a otras clases.
  • clase puede ejecutar métodos (es decir, no un struct C)
  • miembros de la clase que contienen son visibles/accesibles a la clase anidada

Teniendo en cuenta los comentarios, estoy simplificando los requisitos:

  • clase interna puede ser accesible para otras clases, pero no visible (similar al uso de una categoría para ocultar los métodos privados).
  • clase interna no tiene que ser anidado

¿Es todavía no es posible?

+0

¿Qué pasa con 'class'? – Dani

+1

Lo sentimos, lo que estás pidiendo no existe en Obj-C. –

+0

@Kevin Ballard: existe en Obj-C++ – Dani

Respuesta

84

Objective-C no tiene ninguna noción de clases privadas o variables de instancia privada en una forma declarativa formal.

En cambio, la visibilidad en Objective-C está completamente controlada por el lugar donde declaras algo. Si está en un archivo de encabezado, puede ser importado por otra cosa. Si se declara en un archivo de implementación, no se puede (razonablemente) importar y, por lo tanto, es efectivamente privado para esa unidad de compilación.

Y por "eso", quiero decir prácticamente cualquier cosa que pueda declararse; clase, global, etc ...

I.e. si pega un par de @interface/@implementation para una clase en un archivo .m, esa clase es efectivamente privada para esa unidad de compilación. Por supuesto, sin espacios de nombres, asegúrese de que la clase tenga un nombre único.


Considera:

foo.h:

@interface Foo: NSObject 
... public interface 
@end 

Foo.m:

@interface __FooSupportClass: NSObject 
... interface here ... 
@end 

@implementation __FooSupportClass 
@end 

@interface Foo() 
@property(retain) __FooSupportClass *__fooSupport; 
@end 

@implementation Foo 
@synthesize __fooSupport = fooSupport__; 
... etc ... 
@end 

Eso le da una clase de apoyo-privada por la visibilidad sólo está disponible en su implementación con una variable de instancia y métodos setter/getter en su clase que no son visibles fuera de la compilación unidad tampoco.

(Tenga en cuenta que Objective-C tiene "variables de instancia", no "variables miembro". Son similares, pero usted será mejor usar el vocabulario de la lengua.)

+0

Ese fue mi enfoque original. Sin embargo, necesito una instancia de esa clase interna para ser miembro. ¿Cómo puedo hacer eso? ¿Podría una declaración avanzada de clase hacer el truco? – Ovesh

+0

OK, acabo de comprobarlo. OK, ese es el enfoque que seguiré. Por supuesto, el problema de los miembros de la clase contenedora no accesibles a la clase interna permanece. – Ovesh

+0

¿Cómo acceder a una variable de foo desde fooSupport? ¿Es posible? – Sakthimuthiah

1

bien se puede tener " métodos privados semi ocultos. Puede incluir un archivo de interfaz que proporcione los métodos de extensión que se encuentran en el archivo de implementación y luego implementar los métodos declarados allí. Tenía curiosidad acerca de esto antes y le hice una pregunta similar.

Proper Objective-C Helper "Wannabe" Private methods?

Cuestiones relacionadas