NSDictionary包含属于层次结构的多个对象

时间:2015-07-13 12:46:15

标签: ios objective-c inheritance nsdictionary

我有一个名为A的类和三个A:SubA0, SubA1, SubA2的子类。我需要一个字典来包含这些对象,我用这种方式创建它:

NSDictionary* dic = [[NSDictionary alloc]initWithObjectsAndKeys:
                   [[SubA0 alloc]init], @"SubA0",
                   [[SubA1 alloc]init], @"SubA1",
                   [[SubA2 alloc]init], @"SubA2", nil];

在课程A中有一个方法:

-(void)theMethod{
    NSLog(@"theMethod - Class A");
}

在所有三个子类中重写此方法:

Class SubA0:

-(void)theMethod{
    NSLog(@"theMethod - Class SubA0");
}

Class SubA1:

-(void)theMethod{
    NSLog(@"theMethod - Class SubA1");
}

Class SubA2:

-(void)theMethod{
    NSLog(@"theMethod - Class SubA2");
}

在我的ViewController中,这行代码:

[[dic objectForKey:classIdentifier]theMethod];

总是在超级课程中调用该方法,但显然我不想要这个。我希望系统根据类类型调用正确的方法。

此问题是否与属于NSDictionary的objectForKey:方法有关?提前谢谢。

1 个答案:

答案 0 :(得分:0)

问题出在我的自定义初始化程序中。类A有两个init方法:

-(instancetype)init;
-(instancetype)initWithAParam:(Param *)defaultParam;

实施是:

-(instancetype)init{
    return [[A alloc] initWithAParam:0];
}
-(instancetype)initWithAParam:(Param *)defaultParam{
    self = [super init];

    if(self){
        _param = defaultParam;
    }

    return self;
}

显然,当我写道:

[[SubA0 alloc]init];
[[SubA1 alloc]init];
[[SubA2 alloc]init];

系统调用super init,此方法返回A个对象。要解决此问题,只需以这种方式重写init

-(instancetype)init{
    return [self initWithAParam:0];
}

谢谢大家!