2009-10-04 7 views
10

Tengo dos subclases, una que tiene mucha personalización, la llamaremos Foo, y otra subclase que solo necesita 1 método anulado, y doesn ' Necesitamos cualquier variable adicional, lo llamaremos Bar.Objective-C múltiples definiciones de clase en una .h y .m

La barra será una de las variables de Foo, así que para evitar tener 2 archivos más con los que trabajar (.m y .h para Bar) me gustaría conectar e implementar Bar en los archivos .h y .m de Foo .

Mi mejor esfuerzo me da varios errores de compilación.

El archivo .h se parece a:

#import <UIKit/UIKit.h> 

@interface Foo : FooSuperClass { 
    Bar *barVariable; 
} 

@property (nonatomic, retain) Bar *barVariable; 

-(void) fooMethod; 
@end 

@interface Bar : BarSuperClass { 
} 

@end 

El archivo .m parece:

#import "Foo.h" 


@implementation Foo 
@synthesize barVariable; 

-(void) fooMethod{ 
    //do foo related things 
} 
@end 

@implementation Bar 
- (void)barSuperClassMethodIWantToOverride{ 
} 
@end 

Soy consciente de que este tipo de cosas en general, sería mal visto, pero siento que es apropiado en mi situación. El primer error que obtengo es "especificador-calificador-lista esperado antes de la barra".

Qué he hecho mal, estoy bastante seguro de que es posible tener varias declaraciones/definiciones en un solo archivo.

Respuesta

9

En su encabezado ha utilizado Bar antes de declararlo. Solución: ponga la definición Bar antes de Foo 's.

+9

A menudo es mejor utilizar la directiva '@ class'. Por ejemplo, ¿qué sucede si luego tiene una variable de instancia de tipo 'Foo' declarada en' Bar'? –

25

El compilador solo considera los tipos válidos que se han visto anteriormente. Como dijo Nikolai, puedes declarar Bar antes de Foo.

Sin embargo, eso no siempre es posible. Para otras situaciones, puede usar @class para reenviar declarar la clase.

I.e.

@class Bar; 
@interface Foo : NSObject 
{ 
    Bar *bar; 
} 
@end 

@class Bar; le dice al compilador que existe una clase llamada bar y punteros de barra debe ser considerada válida.

Cuestiones relacionadas