美文网首页
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