继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Object-C篇-设计模式之协议

幕布斯6054654
关注TA
已关注
手记 1258
粉丝 219
获赞 1011

一 : 简述

在Java中也有与协议相似的概念,称为接口-interface,是常量与抽象方法的集合.但是在OC中协议-protocol,协议就是是一方法的声明,这些方法可以有选择实现与必须要实现的.

二 : 协议的定义

@protocol 协议名称// 方法声明列表@end

示例
创建了一个协议,其中有一个必须实现的方法study

@protocol StudyProtocol <NSObject>- (void)study;@end

三 : 遵守协议

有了协议,那么如何使用这个协议呢.
让类遵守协议

@interface 类名 : 父类 <协议名称1, 协议名称2,…>@end

OC是单继承,但是一个类可以遵守一个或多个协议

@interface Person : NSObject<EatProtocol, StudyProtocol>@end
@implementation Student// 实现协议方法- (void)EatSomting
{    NSLog(@"%s", __func__);
}// 实现协议方法- (void)study
{    NSLog(@"%s", __func__);
}

协议和继承的区别

  • 继承之后默认就有实现, 而protocol只有声明没有实现

  • 相同类型的类可以使用继承, 但是不同类型的类只能使用protocol

  • protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可

四 : 协议的使用特点

  • 父类遵守了某个协议,那么子类也自动遵守此协议

父类遵守了此协议

@interface Person : NSObject< StudyProtocol>@end

子类自然遵守此协议

@interface Student : Person@end
@implementation Sutdent-(void)study{
    
}
  • 协议可以遵守协议

一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明

@protocol A-(void)methodA;@end@protocol B <A>-(void)methodB;@end
@interface TZperson : NSObject <B>-(void)methodA; // 同时拥有A/B协议中的方法声明-(void)methodB;@end
  • 基协议

每个协议都应该遵守NSObject协议,它是一个基协议,最根本的协议.

@protocol A<NSObject> // 基协议-(void)methodA;@end
  • required 与 optional关键字

required: 方法必须要实现,不实现则编译器会发出警告
optional : 方法不一定要实现
用于开发者之间的交流
如果没有使用任何关键字修饰协议中的方法,那么该方法默认就是required的,关键字并不能严格的控制某一个遵守该协议的类必须要实现该方法, 因为即便不是实现也不会报错, 只会报一个警告

@protocol A@required-(void)methodA;@optional-(void)methodA;@end

五 : 类型限定

定义协议

@protocol girlGod@required-(void)beatuiful;@optional-(void)sexy;@end

要求某些对象具备上述协议行为,可以将协议写在数据类型的右边,明确的标注如果想给该变量赋值,那么该对象必须遵守某个协议

id<girlGod> girl = [girl new];

格式 : 数据类型<协议名称> 变量名,和泛型是一个写法

六 : respondsToSelector

当某个类遵守了某个协议,但并意味着,它就一定要实现它,因为不实现也不报错.当这个类被实例化,意味着可以调用其遵守的协议方法,但如果没有实现就会报错,所以要使用respondsToSelector进行判断是否实现了某些协议方法

@protocol wiftPro <NSObject>-(void)dohouseWork;
-(void)papapa;@end
@interface wife : NSObject<wiftPro>
 if ([self.wift respondsToSelector:@selector(dohouseWork)]) {
        [self.wift papapa];
    }



作者:TianTianBaby223
链接:https://www.jianshu.com/p/762ee6ae8994


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP