从子类访问超类属性

时间:2013-04-02 17:30:54

标签: objective-c

我在实现一个简单的超级/子类方案时遇到了一些麻烦。我在超类中声明了一个NSMutableDictionary,并且我试图在子类中访问它,但它只返回null。任何帮助将不胜感激。

@interface RootModel : NSObject <Updatable, TouchDelegate>
@property (nonatomic) NSMutableDictionary *gameValues;
@end

@interface SubclassModel : RootModel
@end

@implementation RootModel

- (id)initWithController:(id)controller {
    if ((self = [super init])) {
        _controller = controller;

        _gameValues = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithFloat:300.0f], KEY_JUMP_VELOCITY,
                       [NSNumber numberWithFloat:49.47f], KEY_GRAVITY,
                       [NSNumber numberWithFloat:0.25f], KEY_JUMP_TIME_LIMIT,
                       nil];

        NSLog(@"%@", _gameValues);

    }
    return self;
}

@implementation SubclassModel

- (id)init{
    if ((self = [super init])) {
        // This NSLog prints "(null)" if using super.gameValues or self.gameValues, why?
        NSLog(@"subclass: %@", super.gameValues);

    }
    return self;
}
@end

我做错了什么?

2 个答案:

答案 0 :(得分:2)

当Catfish_Man回答时,您的init方法需要致电[super initWithController:]。但是,您似乎用您的注释显示了对类/超类继承模型的误解:

  

我的超类由另一个控制器类初始化。对超级属性的任何调用(在initWithController :)中初始化都是有效的(它们返回值,而不是null)。

当您创建SubclassModel的实例时,该实例的部分一个RootModel实例。 RootModel实例 与<{1}}或SubclassModel的任何其他实例共享

因此,如果“另一个控制器类”创建并初始化RootModel的实例,而后者又会显示您的RootModel输出,那么这与您的NSLog实例完全不同 - 并且SubclassModel实例中的RootModel未初始化,因为您没有致电SubclassModel,因此[super initWithController:]中的NSLog显示{{} 1}}。

答案 1 :(得分:1)

您的子类init方法需要调用[super initWithController:],因为那是实际初始化发生的地方。

(或超类initWithController:需要调用[self init],您需要将您依赖的初始化工作移至init