美文网首页
OC:类族

OC:类族

作者: 春暖花已开 | 来源:发表于2018-11-25 12:37 被阅读8次
    "类族"是一种很有用的模式(pattern),可以隐藏“抽象基类”背后的实现细节。

    比如UIKit框架中的UIButton类,想创建按钮,需要调用下面这个"类方法":

    + (instancetype)buttonWithType:(UIButtonType)buttonType;
    

    该方法返回的对象,其类型取决于传入的按钮类型(button type)。然而,不管返回什么类型的对象,他们都继承自同一个基类:UIButton。这么做的意义在于:UIButton类的使用者无须关心创建出来的按钮具体属于哪个子类,也不用考虑按钮的绘制方式等实现细节。使用者只需要明白如何创建按钮,如何设置“标题”(title)这样的属性,如何增加触摸动作的目标对象等问题就好。

    定义抽象基类
    MZWorker.h
    #import <Foundation/Foundation.h>
    
    typedef NS_ENUM(NSUInteger, MZWorkerType) {
        MZWorkerTypeCoder,
        MZWorkerTypeHR,
        MZWorkerTypeFinance,
    };
    
    @interface MZWorker : NSObject
    
    + (instancetype)workerWithType:(MZWorkerType)type;
    
    - (void)printMyOwnJobName;
    
    
    @end
    
    MZWorker.m
    #import "MZWorker.h"
    
    #import "MZHR.h"
    #import "MZCoder.h"
    #import "MZFinance.h"
    
    @implementation MZWorker
    
    + (instancetype)workerWithType:(MZWorkerType)type {
        
        switch (type) {
            case MZWorkerTypeHR: {
                return [[MZHR alloc] init];
            }
                break;
            case MZWorkerTypeFinance: {
                return [[MZFinance alloc] init];
            }
                break;
            case MZWorkerTypeCoder: {
                return [[MZCoder alloc] init];
            }
                break;
        }
    }
    
    // 需要由子类重写
    - (void)printMyOwnJobName {
        
    }
    
    @end
    
    以MZCoder为例
    #import "MZWorker.h"
    
    @interface MZCoder : MZWorker
    
    @end
    
    #import "MZCoder.h"
    
    @implementation MZCoder
    
    - (void)printMyOwnJobName {
        NSLog(@"MZCoder");
    }
    
    @end
    
    使用
        [[MZWorker workerWithType:MZWorkerTypeCoder] printMyOwnJobName]; ///< 打印:MZCoder
    
        [[MZWorker workerWithType:MZWorkerTypeFinance] printMyOwnJobName]; ///< 打印:MZFinance
    
        [[MZWorker workerWithType:MZWorkerTypeHR] printMyOwnJobName]; ///< 打印:MZHR
    

    相关文章

      网友评论

          本文标题:OC:类族

          本文链接:https://www.haomeiwen.com/subject/apkpqqtx.html