2013-03-11 2 views
-4

это мой час файл:наследования и Objective-C

#import <Foundation/Foundation.h> 

@interface Base : NSObject 

@end 

это мой м-файл:

#import "Base.h" 
@interface Base() 
@property (nonatomic) int number; 
@end 

@implementation Base 

-(void) setNumber: (int) p_number 
{ 
    self.number = p_number; 
} 

@end 

это то, что я хочу сделать файл H:

#import <Foundation/Foundation.h> 
#import "Base.h" 

@interface Derived : Base 

@end 

и для этого в файле m

#import "Derived.h" 

@implementation Derived 

- (void) foo 
{ 
    self.number= 7; 
} 

@end 

это, конечно, приводит к ошибке, пожалуйста, ответьте с кодом, который позволяет мне вызывать базовое свойство без размещения определения в часе файл

Thanks

+1

Вы должны работать ответы - вы должны принять одно так это помечено как ответил –

+0

@ Paul.s я могу принять как? –

+0

К сожалению, не –

ответ

1

Вы можете использовать тот же подход, что Apple использует с UIGestureRecognizerSubclass.h

eg Создание

// BaseSubclass.h 

@interface Base (ForSubclassEyesOnly) 

@property (nonatomic, assign) NSInteger number; 

@end 

Вам нужно отключить компилятор с

@implementation Base (ForSubclassEyesOnly) 

@dynamic number; 

@end 

Теперь любой класс, который хочет, чтобы использовать эти свойства/методы вызова включает в себя только этот заголовок.

например

#import "Derived.h" 
#import "BaseSubclass.h" 

@implementation Derived 

- (void) foo 
{ 
    self.number = 7; 
} 

@end 
+0

круто это выглядит чистой реализации, спасибо! –

+0

Что делать, если я хотел переопределить метод setNumber, я не могу использовать self.number, потому что это вызовет рекурсию, и я не могу использовать элемент _number, потому что он не распознается –

+0

'super.number = 7'? –

4

Просить человек ответить только код не хорошая идея. Почему бы не попросить объяснение, что не так, так что вы можете исправить эту ошибку и тонн подобных ошибок в будущем самостоятельно?

Проблема в том, что вы не объявляете свое свойство в базовом заголовке. Если вы не хотите, чтобы сделать это, вы можете объявить его в файле реализации подкласса как расширение базового класса:

Derived.m

#import "Derived.h" 

@interface Base() 
@property (nonatomic) int number; 
@end 

@implementation Derived 

- (void) foo 
{ 
    self.number= 7; 
} 

@end 
+0

Это похоже на довольно проницательный способ достижения желаемого эффекта. Расширение 'Base', вероятно, не должно проживать в файле реализации подкласса ради того, чтобы не вызывать путаницу. –

+0

сначала позвольте мне объяснить, почему я прошу код, лично, когда люди просто объясняют словами, я не полностью понимаю проблема, для многих людей примеры кода более интуитивные, чем другие методы, я один из тех людей –

+0

@ Paul.s Зависит от того, чего он пытается достичь, и это сложно сказать по этому вопросу, но да, хорошая точка. – DrummerB

Смежные вопросы