Effective Objective-C 2.0之Note.04
2015-06-29 15:30
363 查看
“类族”(class cluster)是一种很有用的模式(pattern),可以隐藏“抽象基类”(abstract base class)背后的实现细节。Objective-C的系统框架中普遍使用此模式。
创建类族
现在举例来演示如何创建类族。假设有一个处理雇员的类,每个雇员都有“名字”和“薪水”这两个属性,管理者可以命令其执行日常工作。但是,各种雇员的工作内容却不同。经理在带领雇员做项目时,无须关心每个人如何完成其工作,仅需指示其开工即可。
首先要定义抽象基类:
每个“实体子类”(concrete subclass)都从基类继承而来。例如:
在本例中,基类实现了一个“类方法”,该方法根据待创建的雇员类别分配好对应的雇员类实例。这种“工厂模式”(Factory pattern)是创建类族的办法之一。
Note:如果对象所属的类位于某个类族中,那么在查询其类型信息(introspection)时就要当心了,调用isMemberOfClass返回的是NO,因为创建的是其子类的实例。(可用isKindOfClass)
系统框架中有许多类族。大部分collection类都是类族,例如NSArray与其可变版本NSMutableArray。
新增实体子类:
子类应该继承自类族中的抽象基类。
若要编写NSArray类族的子类,则需令其继承自不可变数组的基类或可变数组的基类。
子类应该定义自己的数据存储方式。
创建类族
现在举例来演示如何创建类族。假设有一个处理雇员的类,每个雇员都有“名字”和“薪水”这两个属性,管理者可以命令其执行日常工作。但是,各种雇员的工作内容却不同。经理在带领雇员做项目时,无须关心每个人如何完成其工作,仅需指示其开工即可。
首先要定义抽象基类:
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。
新增实体子类:
子类应该继承自类族中的抽象基类。
若要编写NSArray类族的子类,则需令其继承自不可变数组的基类或可变数组的基类。
子类应该定义自己的数据存储方式。
相关文章推荐
- Object-C基础--输入5个字符串并排序
- Objective-C语法学习 第四天
- 【iOS开发之Objective-C】Objective-C语言中的OOP
- object-c 全屏播放时动态添加slider
- 关于objective—c如何让JPG文件转化成PDF形式
- Qt源码分析之QObject(转自CSDN,作者oowgsoo)
- [Objective-C] 理解 Objective-C 的 ARC
- java平台下arcobjects的开发
- [Objective-C] iOS 开发中建议使用自动引用计数(ARC)
- [Objective-C] 从“引用计数”过渡到“自动引用计数”(ARC)
- 使用Xcode HeaderDoc和Doxygen文档化你的Objective-C和Swift代码
- poj 3241 Object Clustering 曼哈顿最小生成树
- [Objective-C] Objective-C中的id
- 从 C++ 到 Objective-C 的快速指南
- IOS --Object-C 四种保存数据的方式
- .NET平台开源项目速览(2)Compare .NET Objects对象比较组件
- object reference in Java
- 重踏学习Java路上_Day11(Object)
- IDNFeedParser 一个简单易用的Rss解析库(Objective-C)
- freemarker.core.InvalidReferenceException: Expression stackObject.value.get(propertyName).toString() is undefined