我有一个名为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:
方法有关?提前谢谢。
答案 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];
}
谢谢大家!