NSDictionary 包含属于一个层次结构的几个对象
NSDictionary containing several objects belonging to a hierarchy
我有一个名为 A
的 class 和 A 的三个子 class:SubA0, SubA1, SubA2
。我需要一个字典来包含这些对象,我是这样创建的:
NSDictionary* dic = [[NSDictionary alloc]initWithObjectsAndKeys:
[[SubA0 alloc]init], @"SubA0",
[[SubA1 alloc]init], @"SubA1",
[[SubA2 alloc]init], @"SubA2", nil];
在classA
中有一个方法:
-(void)theMethod{
NSLog(@"theMethod - Class A");
}
此方法在所有三个子classes 中被覆盖:
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];
总是调用超级class中的方法,但显然我不想这样。我希望系统根据 class 类型调用正确的方法。
这个问题是否与属于 NSDictionary 的 objectForKey:
方法有关?提前谢谢你。
问题出在我的自定义初始化程序中。 class A
有两个初始化方法:
-(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
和此方法 returns 一个 A
对象。要解决这个问题,只需这样重写 init
:
-(instancetype)init{
return [self initWithAParam:0];
}
谢谢大家!
我有一个名为 A
的 class 和 A 的三个子 class:SubA0, SubA1, SubA2
。我需要一个字典来包含这些对象,我是这样创建的:
NSDictionary* dic = [[NSDictionary alloc]initWithObjectsAndKeys:
[[SubA0 alloc]init], @"SubA0",
[[SubA1 alloc]init], @"SubA1",
[[SubA2 alloc]init], @"SubA2", nil];
在classA
中有一个方法:
-(void)theMethod{
NSLog(@"theMethod - Class A");
}
此方法在所有三个子classes 中被覆盖:
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];
总是调用超级class中的方法,但显然我不想这样。我希望系统根据 class 类型调用正确的方法。
这个问题是否与属于 NSDictionary 的 objectForKey:
方法有关?提前谢谢你。
问题出在我的自定义初始化程序中。 class A
有两个初始化方法:
-(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
和此方法 returns 一个 A
对象。要解决这个问题,只需这样重写 init
:
-(instancetype)init{
return [self initWithAParam:0];
}
谢谢大家!