在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
分类 在谈分类之前,我们可以先探究下,OC中为什么出现分类这种机制,有什么好处?假设你接到一个大项目:计算两个整数的和,差。接到任务的你马上动手。编写代码如下:#import <Foundation/Foundation> @interface Calculate :NSObject @property int number1,number2; - (int) sumNumber1:(int)num1 andNumber2: (int)num2;//加法 - (int) subNumber1:(int)num1 andNumber2: (int)num2; //减法 - (void)print; @end 好了,完成工作。几天后,客户需求发生变化,不仅需要加法,减法功能,还要能做到乘除。我们的做法一般是直接在Calculate类中添加乘,除的方法。当然在这里是没有任何问题的。但是在现实的项目中,代码量十分巨大,以及业务逻辑相当复杂的情况下,直接修改之前源代码是冒有很大的风险的!现在我们有了另一种做法那就是——分类。#import <Foundation/Foundation> #import”Calculate”//既然是对原有类的接口的扩展,所以必须包括原始接口 @interface Calculate(MulAndDiv)//告诉编译器这是为Calculate定义的分类名为MulAndDiv - (int) MulNumber1:(int)num1 andNumber2: (int)num2;//乘法 - (int) DivNumber1:(int)num1 andNumber2: (int)num2; //除法 @end 这样我们就做到了在不修改原先代码的情况下,完成了功能的扩展!但是使用分类要注意以下事项:1. 分类可以访问原类中的成员变量,但是在分类不能添加任何变量。若需要添加变量可以考虑创建子类2. 分类中的方法名可以与原类的某个方法名相同(即重载),但是原类的同名方法将失效,不能访问。3. 可以创建很多的分类4. 不必实现分类的所有方法。可以在分类中声明所有的方法,但不实现,在需要的时候再去实现。5. 通过分类添加的方法是可以被子类继承的。协议 初次接触协议的人,可能很难理解。协议也可以理解为规则或约定。这就像我们都必须遵守的法律,法律中有宪法,刑法,民法。。。。包含很多的方方面面,告诉了我们在不同情况下,应该怎么做。法律是有使用范围的,中国的法律,只要是中国公民就必须遵守,但是美国人就可以不遵守。同样中国人也可以不遵守美国的法律!OC中的协议即相当与生活中的法律,它定义了很多的方法,但是并没有实现!这需要遵守此协议的类去实现这些方法。这就像你遵守法律去纳税,但法律本身并不纳税。协议没有父类,并且不能定义成员变量(这里有句台词:还有王法吗?王法?我就是王法!显然法律也不能成为某一个人的,同时法律没有身体,不会吃饭)协议是多个类共享的一个方法列表,协议中列出方法没有相应的实现,如果一个类采用名为MyProtocol的协议,就必须实现MyProtocol协议内的@required(必须的)标识的方法。协议用@optional标识的方法可选实现!协议的使用方法:@interface Person :NSObject <chinaProtocol>这条语句告诉编译器,Person遵守chinaProtocol协议如果采用多项协议,只需要他们都列在尖括号中,用逗号分开:@interface Person :NSObject <chinaProtocol , englishProtocol>有关协议的总结:1. 如果一个类遵守某项协议,那么它的子类也遵守该协议2. 协议是无类的(classless),任何类都可以遵守某项协议3. 可以在类型名称后添加 <协议名> ,可以让编译器帮助检查变量的一致性4. 如果变量保存的对象遵守多项协议,可以列出多项协议5. 定义一项协议时,可以扩展现有协议,即新的协议也遵守旧的协议@proticol Drawing3D <Drawing>Drawing3D协议也采用了Drawing协议,因此采用Drawing3D协议的类必须实现Drawing3D列出的方法以及Drawing列出的方法6. 分类也可以采用一项协议@interface Person(chinaPerson) <NSCopying,NSCoding>说明Person类拥有一个分类chinaPerson,这个分类遵守NSCopying 和NSCoding协议
以上纯属本人理解,有不正确之处,欢迎指正! |
请发表评论