#import <Foundation/Foundation.h>
// ProtocolA comply with root protocol
@protocol ProtocolA <NSObject>
// 返回值为遵守了ProtocolA的对象
- (NSObject<ProtocolA> *)getSelf;
@end
// ProtocolB comply with ProtocolA
@protocol ProtocolB <ProtocolA>
@required // 以下方法需要实现
+ (id)getSelfClass;
- (Class)getSelfClass;
@end
@protocol ProtocolC <NSObject>
@optional // 以下方法选择性实现
- (void)methodC;
@end
// ClassA comply with ProtocolB and ProtocolC
@interface ClassA :NSObject <ProtocolB,ProtocolC>
// _obj成员限定指向实现了ProtocolB的对象
@property(nonatomic,strong) NSObject<ProtocolB> *obj;
@end
@implementation ClassA
+(id)getSelfClass
{
return self;
}
- (NSObject<ProtocolA> *)getSelf
{
return self;
}
- (Class)getSelfClass
{
return [self class];
}
@end
int main()
{
ClassA<ProtocolB> *a=[[ClassA alloc] init];
// a2限定指向实现了 ProtocolA 的对象
id<ProtocolA> a2=[[ClassA alloc] init];
[a setObj:a2];
NSLog(@"a=%@,aClass=%@,a2Class=%@",
[a getSelf],[a getSelfClass],[[a2 class] getSelfClass]);
return 0;
}
protocol:
概念:
用来声明方法(也只能声明方法),遵守了该协议的 类或其他协议 就拥有这些方法的声明;
类似java中的interface,但是由于OC是弱类型语言(java为强类型),
许多类型上的不匹配都只是warning;
protocol与 (java中)interface 区别:
1>interface类型变量只能指向 实现了该interface的对象,
而protocol本身不是类型,无法用于声明变量;
这种多态的特征在OC中则表现为 指定了protocol 的变量
限定指向 遵守了该protocol的对象(OC中此类规则违反仅仅警告),
例:id<ProtocolA> p=[[ClassA alloc] init];(ClassA遵守了ProtocolA)
2>遵守了protocol却没实现当中方法只是警告,interface中是编译错误
声明protocol:
//NSObject为基协议,与基类NSObject同名,但不同,
//基类 NSObject 遵守了 基协议 NSObject
//与类都继承基类一样,官方建议 协议都遵守基协议
@protocol ProtocolA <NSObject>
//协议中声明的方法可以规定为须实现或可选,默认为 required
@required // 此后声明的方法都为required,遵守该协议的类中不实现就会警告
- (id<ProtocolA>)methodA:NSObject<ProtocolA> *obj;
- (void)methodB;
@optional // 此后声明的方法都为optional,遵守该协议的类中不实现不会警告
- (id)methodC:ClassA<ProtocolB> obj;
- (void)methodD;
@end
类遵守protocol:
// OC类是单继承,但可以遵守多个协议
@interface ClassA :NSObject <ProtocolA,ProtocolB>
@end
@implementation ClassA
//这里实现协议中的方法
@end
使用规范:
为了提高编译效率,.h一般不import协议,用@protocol ProtocolA,ProtocolB; 这种
方式来告诉编译器ProtocolA与ProtocolB是协议,而在.m中再import,
与@class ClassA,ClassB; 方式一样;