• Effective Objective-C 2.0之Note.04


    类族”(class cluster)是一种很有用的模式(pattern),可以隐藏“抽象基类”(abstract base class)背后的实现细节。Objective-C的系统框架中普遍使用此模式。

    创建类族

    现在举例来演示如何创建类族。假设有一个处理雇员的类,每个雇员都有“名字”和“薪水”这两个属性,管理者可以命令其执行日常工作。但是,各种雇员的工作内容却不同。经理在带领雇员做项目时,无须关心每个人如何完成其工作,仅需指示其开工即可。

    首先要定义抽象基类:

        typedef NS_ENUM(NSUInteger, EOCEmployeeType) {  
            EOCEmployeeTypeDeveloper,  
            EOCEmployeeTypeDesigner,  
            EOCEmployeeTypeFinance,  
        };  
         
        @interface EOCEmployee : NSObject  
         
        @property (copy) NSString *name;  
        @property NSUInteger salary;  
         
        // Helper for creating Employee objects  
        + (EOCEmployee*)employeeWithType:(EOCEmployeeType)type;  
         
        // Make Employees do their respective day's work  
        - (void)doADaysWork;  
         
        @end  
         
        @implementation EOCEmployee  
         
        + (EOCEmployee*)employeeWithType:(EOCEmployeeType)type {  
            switch (type) {  
                case EOCEmployeeTypeDeveloper:  
                    return [EOCEmployeeDeveloper new];  
                    break;  
                case EOCEmployeeTypeDesigner:  
                    return [EOCEmployeeDesigner new];  
                    break;  
                case EOCEmployeeTypeFinance:  
                    return [EOCEmployeeFinance new];  
                    break;  
            }  
        }  
         
        - (void)doADaysWork {  
            // Subclasses implement this.  
        }  
         
        @end 

    每个“实体子类”(concrete subclass)都从基类继承而来。例如:

        @interface EOCEmployeeDeveloper : EOCEmployee  
        @end  
         
        @implementation EOCEmployeeDeveloper  
         
        - (void)doADaysWork {  
            [self writeCode];  
        }  
         
        @end 

    在本例中,基类实现了一个“类方法”,该方法根据待创建的雇员类别分配好对应的雇员类实例。这种“工厂模式”(Factory pattern)是创建类族的办法之一。

    Note:如果对象所属的类位于某个类族中,那么在查询其类型信息(introspection)时就要当心了,调用isMemberOfClass返回的是NO,因为创建的是其子类的实例。(可用isKindOfClass

    系统框架中有许多类族。大部分collection类都是类族,例如NSArray与其可变版本NSMutableArray。

    新增实体子类:

    1. 子类应该继承自类族中的抽象基类。
    2. 若要编写NSArray类族的子类,则需令其继承自不可变数组的基类或可变数组的基类。
    3. 子类应该定义自己的数据存储方式。
     
     
    如有疑问,共同探讨,共同进步。
  • 相关阅读:
    J Identical Trees(求俩个树转化所需的最小代价,hash判同构,费用流求转移代价)
    I Tournament(俩人一组,构造最少排队总时间)
    D
    purfer序列(有关度数与生成树个数情况)
    博客园自定义样式
    莫比乌斯知识点整理
    随笔日记
    牛客小白月赛16
    Codeforces Round #555 (Div. 3)
    Codeforces Round #553 (Div. 2)
  • 原文地址:https://www.cnblogs.com/nielsen/p/4832896.html
Copyright © 2020-2023  润新知