假设我有一个母类(抽象的或非抽象的)Item 和两个子类 ItemA 和 ItemB,它们都继承自 Item
所有实例都是通过以下方法基于NSDictionary创建的
-(id)initWithJSON:(NSDictionary *)d{
//first instantiate common properties from the motherclass
if ([super initWithJSON:d]){
//Do specific stuff for the subclass
}
return self;
}
现在假设我从网络服务中获取一个数组,该数组可以同时包含要创建的 ItemA 和 Item。
目前我所做的是使用 if/then 条件来确定我将根据字典内容实例化哪个子类,例如:
[(NSArray*)data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj[@"kind"] isEqualToString:@"A"])
[interactions addObject:[[ItemA alloc] initWithJSON:obj]];
else if ([obj[@"kind"] isEqualToString:@"B"])
[interactions addObject:[[ItemB alloc] initWithJSON:obj]];
else
[interactions addObject:[[Item alloc] initWithJSON:obj]];
}];
现在我的观点如下:有没有一种方法只有一行代码,默认情况下,实例化一个 Item 对象,并基于类型 ItemA 或 ItemB 换句话说,如果在解析的 NSDictionary 参数中满足某些条件,我是否可以在母类 Item 的 init 方法中编写一些代码来实例化子类?
谢谢
最佳答案
在你的母类中,添加一个像这样的便捷方法:
+(instancetype)itemWithJSON:(NSDictionary *)obj {
id item;
if ([obj[@"kind"] isEqualToString:@"A"]) {
item = [[ItemA alloc] initWithJSON:obj];
} else if ([obj[@"kind"] isEqualToString:@"B"]) {
item = [[ItemB alloc] initWithJSON:obj];
} else {
item = [[Item alloc] initWithJSON:obj];
}
return item;
}
然后像这样使用它:
[(NSArray*)data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[interactions addObject:[Item itemWithJSON:obj]];
}];
关于ios - 智能地从母类实例化子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340887/