一、继承
继承是指一个新类拥有被继承类(父类)的全部属性和方法。
继承的好处:代码重用
继承的缺点:父类的改变影响所有的子类
OC是单继承:一个类只能继承一个直接父类;
OC是多层继承:B类继承A类,C类可以继承B类
二、分类(Category)
使用场景:在大型项目,企业级开发中多人同时维护同一个类,此时程序员A因为某项需求只想给当前类currentClass添加一个方法newMethod,那该怎么办呢?最简单粗暴的方式是把newMethod添加到currentClass中,然后直接实现该方法就OK了。但考虑到OC是单继承的,子类可以拥有父类的方法和属性。如果把newMethod写到currentClass中,那么currentClass的子类也会拥有newMethod。但真正的需求是只需要currentClass拥有newMethod,而currentClass的子类不会拥有。为了解决这个问题,就引入了分类的概念。
分类作用:扩展已有类的功能。
特点:运行时决议 可以为系统类添加分类
分类中都可以添加哪些内容:实例方法 类方法 协议 属性(原则上讲它只能添加方法, 不能添加属性,实际上可以通过其它方式添加属性)
分类做了哪些事(声明私有方法、分解体积庞大的类文件)
注意!!!不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法。如果你在分类中增加了一个与原有类同名的方法,那么分类中的方法会覆盖原有类的方法。
三、扩展
特点:编译时决议
分类与扩展的区别:
①分类原则上只能增加方法(能添加属性的的原因只是通过runtime解决无setter/getter的问题而已);
②扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型;
③类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。
④类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
网友评论