如何对一个类进行扩展?
在对类的处理中,我们会应用到的主要由四种方式,
一、 继承(inherit)
面向对象程序有三大特性,封装、继承、多态。
封装就是对一个类或者我们需要的一系列行为进行整理,只是给出外界一定的interface,通过这些Interface我们就可以对这一系列行为进行管理。使用的时候给对象发送消息就可以了。
继承是针对两个有相互关系的类而言的,子类拥有父类所有的实例变量和行为方法,子类可以调用父类中所有方法。注意区别继承与包含。
多态指的是?
这里我们可以看出,子类继承父类中所有行为。换个角度来说,我们已经有了一个类,如果需要扩展这个类,那么其中的一种方法就是给他找一个父类继承之。这样一下子就可以逆袭了。
继承的方法不再赘述。
多态
二、 分类或者类目(category)
什么是category?
Category就是对一个已知的类拓展一个分类(含有.h和.m),在新建分类class的时候,注意选择主类,也就是需要给哪个类进行拓展。
如何使用?
(1)选择创建分类
(2)在分类中创建方法声明和方法实现。
注意在实现的时候使用self关键字。
(3)导入分类头文件#import "NSString+StringAdd.h"
(4)用分类中方法给对象(或者类)发送消息。注意这里如果是+方法的时候,我们的类名指的是主类名称,并不是分类名称。
使用Category给我们带来哪些便利?
Category可以对类进行拓展,丰富了原来的类,使得原来的类增加了现在类的方法。
注意:分类无法增加实例变量,只能给主类增加方法声明和实现。如果要对类进行实例变量的增加,那么请使用继承。继承常见于开源代码中,因为开源代码我们能够对父类的特性了解得十分清楚。对于闭源代码中,我们对父类的代码并不了解,因此我们使用分类来进行扩展。
三、 协议(protocol)
协议一般情况下与代理(delegate)联合使用
什么是协议?
Protocol是一份接口协议,这份协议里面仅仅只有方法声明,这些声明中规定了@required与@optional,也就是规定了协议中的必修课与选修课。
协议的使用?
当需要遵循协议的时候,我们需要使得该类遵循协议,也就是在父类后加上<协议名>
@interface Person : NSObject<NSCopying>
举例来说:男女结婚案例
男方要遵循相关协议,才能够迎娶女方。在遵循协议的时候,男方就是一个代理过程,代理了这个协议的内容,然后具体对协议的执行实现是由男方决定。
协议的用处?
简化代码,控制类。
通常与代理(delegate)联合使用
凡是某些任务自己不去实现,想让别人去帮你实现的,name你就可以写一份协议,将该协议交给代理人,让代理去实现。你只需要通知代理去做某件事。
四、 延展(extension)
extension可以认为是匿名的category,但是这个extension相对于category有一个特殊功能:在extension中可以定义可写的属性,公有可读、私有可写的属性(Publicly-Readable, Privately-WriteableProperties)一般这样实现!
例如:
@interface Person ()//在延展(extension)中,定义的私有方法只能在.m文件中进行实例变量定义与方法声明,当我们需要添加私有的实例变量时候,括号中为空。在这里声明的方法在下面实现文件中实现。这里方法与变量只能在.m文件中使用。
{
NSString *_sex;
}
- (void)sayHi;
@end
@implementation Person
- (void)sayHi
- {
- }
@end
五、 总结
在对类的处理中,protocol力量比较薄弱,仅仅能够提供接口,具体的实现还得看代理者的实现方法。而extension是对变量可见度进行控制。Category不提供接口,也提供实现方法,相对较为强大。这些关键字中,最强大的莫过于继承inherit,因为inherit不仅继承了类,还扩大了自己的类,不仅可以扩展方法,而且可以扩展实例变量。
开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。