2009-10-17 11 views
12

estaba leyendo cómo implementar métodos particulares en Objective-C (Best way to define private methods for a class in Objective-C) y una pregunta aparecido en mi mente:Los métodos privados utilizando categorías en Objective-C: super llamando desde una subclase

¿Cómo se gestiona para implementar métodos protegidos, es decir, métodos privados que sean visibles para las subclases?

Supongamos que tengo un MySuperClass con una Categoría que contiene todos sus métodos privados, y quiero implementar MySubclass reemplazando o llamando a super a uno de los métodos privados MySuperClass. ¿Es eso posible (usando el enfoque de Categorías para implementar métodos privados)?

Eche un vistazo a parte de este código, en la parte inferior se encuentra el método modificado.

// =========================== 
// = File: MySuperClass.h 
// = Interface for MySuperClass 
// =========================== 

@interface MySuperClass : Object 
... 
@end 

// =========================== 
// = File: MySuperClass.m 
// =========================== 
#import "MySuperClass.h" 

// ================================= 
// = Interface for Private methods 
// ================================= 
@interface MySuperClass (Private) 

-(void) privateInstanceMethod; 

@end 

// ===================================== 
// = Implementation of Private methods 
// ===================================== 
@implementation MySuperClass (Private) 

-(void) privateInstanceMethod 
{ 
    //Do something 
} 

@end 

// ================================ 
// = Implementation for MySuperClass 
// ================================ 
@implementation MySuperClass 
... 
@end 




// =========================== 
// = File: MySubClass.h 
// = Interface for MySubClass 
// =========================== 

@interface MySubClass : MySuperClass 
... 
@end 


// ================================ 
// = Implementation for MySubClass 
// ================================ 

#import MySubClass.h 

@implementation MySubClass 
//OVERRIDING a Super Private method. 
-(void) privateInstanceMethod 
{ 
    [super privateInstanceMethod]; //Compiler error, privateInstanceMethod not visible! 
    //Do something else 
} 
@end 

Esperemos que alguien ya se haya dado cuenta de esto.

¡Salud!

+0

"Por suerte, alguien ya se dio cuenta de esto." ... ¿Qué estás preguntando? –

+0

Confusión de lenguaje, creo. Fijo. – nall

+1

Gracias nall por hacer que mi pregunta sea más fácil de entender para todos. Cometí un error al usar la palabra "afortunadamente" cuando en realidad estaba "con suerte". Lo siento y muchas gracias! – Lio

Respuesta

13

This GNUStep page describe un enfoque Sección 4.5:

... El lado positivo de esto es que le permite simular protegido métodos también. Para esto, el escritor de una subclase debe ser informado de algún modo acerca de los métodos protegidos , y deberán cumplir con las advertencias del compilador . Como alternativa, podría declarar la categoría Protegido en un archivo de interfaz independiente (por ejemplo, "PointProtected.h"), y proporcionar este archivo interfaz con el entendimiento que sólo debe ser importado y utilizado por archivo de interfaz de una subclase .

+0

Así es como lo hago. Simplemente ponga las declaraciones de métodos en un encabezado de categoría, pero impleméntelas en el bloque de implementación principal. Entonces los archivos que necesitan saber sobre el método solo tienen que '# import' el encabezado. –

+0

Les agradezco tanto a Dave como a todos. Aclamaciones – Lio

13

En Apple, cuando construyen los marcos del patrón típico es tener un encabezado pública (MyClass.h) y una cabecera privada (MyClass_private.h), y sólo copiar las cabeceras públicas en el producto de construcción. El archivo .m importará ambos, por supuesto.

Cuestiones relacionadas