2015-07-13 69 views
1

我有一个类叫做A和三个子类的A:SubA0, SubA1, SubA2。我需要一本字典包含这些对象和我创造这样说:NSDictionary包含几个对象属于一个层次结构

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"); 
} 

此方法在所有三个子类覆盖:

类SubA0:

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

类SubA1:

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

类SubA2:

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

在我ViewController,这行代码:

[[dic objectForKey:classIdentifier]theMethod]; 

总是调用父类的方法,但很明显,我不希望这样。我希望系统根据类的类型调用正确的方法。

此问题与属于NSDictionary的objectForKey:方法有关吗?先谢谢你。

+2

@SaurabhPrajapati这不是造成问题的原因,问题清楚地表明,超类实现在调用子类实现时被调用。 –

+1

@SaurabhPrajapati:我不明白你的答案。问题是,当我调用从字典中提取的对象上的方法时,此对象始终被视为A对象。这是错误的,因为我的字典中的所有对象的类型都是SubA0,SubA1,SubA2 ... – superpuccio

+1

忽略问题中的拼写错误(:在方法签名的末尾导致编译器错误)我还没有能够重现这个问题。你能发布你正在使用的实际代码吗?此外,我会建议朝着[现代下标语法](http://nshipster.com/object-subscripting/)而不是繁琐的字典初始化和objectForKey:方法。 –

回答

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]; 
} 

谢谢大家!