2009-10-04 5 views
10

Ich habe zwei Unterklassen, eine, die viel Anpassung hat, wir nennen es Foo, und eine andere Unterklasse, die nur 1 Methode überschrieben benötigt, und doesn ' Ich brauche keine zusätzlichen Variablen, wir nennen es Bar.Objective-C mehrere Klassendefinitionen in einer .h und .m

Bar wird eine der Variablen von Foo sein, damit keine 2 Dateien mehr arbeiten müssen (.m und .h für Bar) Ich möchte die Bar in Foo's .h und .m Dateien verbinden und implementieren .

Meine beste Leistung gibt mir mehrere Compilerfehler.

Die .h-Datei wie folgt aussieht:

#import <UIKit/UIKit.h> 

@interface Foo : FooSuperClass { 
    Bar *barVariable; 
} 

@property (nonatomic, retain) Bar *barVariable; 

-(void) fooMethod; 
@end 

@interface Bar : BarSuperClass { 
} 

@end 

Die .m-Datei wie folgt aussieht:

#import "Foo.h" 


@implementation Foo 
@synthesize barVariable; 

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

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

Mir ist klar, dass diese Art der Dinge in der Regel verpönt würde, aber ich halte es für angebracht ist in meiner Situation. Der erste Fehler, den ich bekomme, ist "Expectifier-Qualifier-Liste vor Bar".

Was habe ich falsch gemacht, ich bin mir ziemlich sicher, dass es möglich ist, mehrere Deklarationen/Definitionen in einer einzigen Datei zu haben.

Antwort

9

In Ihrer Kopfzeile haben Sie Bar vor der Deklaration verwendet. Lösung: Setzen Sie die Bar Definition vor Foo 's.

+9

Es ist oft besser, die Anweisung '@ class' zu verwenden. Was passiert zum Beispiel, wenn Sie eine Instanzvariable vom Typ 'Foo' in' Bar' deklariert haben? –

25

Der Compiler berücksichtigt nur gültige Typen, die er zuvor gesehen hat. Wie Nikolai erwähnte, können Sie Bar vor Foo deklarieren.

Das ist jedoch nicht immer möglich. Für andere Situationen können Sie @class verwenden, um die Klasse weiterzuleiten.

I.e.

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

@class Bar; teilt dem Compiler mit, dass es eine Klasse mit dem Namen Bar und Zeiger auf Bar existiert als gültig anerkannt.

Verwandte Themen