ios - 智能地从母类实例化子类

标签 ios objective-c class inheritance initialization

假设我有一个母类(抽象的或非抽象的)Item 和两个子类 ItemAItemB,它们都继承自 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 对象,并基于类型 ItemAItemB 换句话说,如果在解析的 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/

相关文章:

ios - 弹出以在导航堆栈中查看 Controller

iphone - iPhone 模式下 iPad 上的 Jagged Quartz 2D 渲染

c++ - 获取模板类的类型

c++ - 为什么我的类(class)不是原型(prototype)?

java - 对象被视为未初始化的变量

iPhone:导航栏返回导航项目onClick-event?

ios - UILabel具有自动布局的丑陋旋转动画

objective-c - 在 iOS objective-c 中将 iPhone 属性设置为只读

objective-c - 使用Objective-C,什么情况下需要手动进行内存管理?

ios - 我如何访问 TableView 单元格中包含的 CollectionView 单元格中的按钮标签