实现的方法
#import "Children.h"
@implementation Children
-(void) eat{
NSLog(@"eat");
}
-(void) setname{
NSLog(@"Student--setname");
}
-(NSString*) getname{
return @"qingyuan";
}
@end
下面使用测试代码,看看一个类遵循两个协议的效果:
Children *child=[[Children alloc] init];
NSString *name=[child getname];
NSLog(@"name=%@",name);
[child eat];
[child setname];
在上面的代码中可以正常运行,但是要注意如果可选择实现的方法没有去实现,而在这里去调用的话会报错。
四. 正式协议和非正式协议
说道正式协议和非正式协议,其实只要理解两个关键字@interface 和 @protocol 。先看看下面一个列子
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
#import "NewProtocol.h"
@interface Children : NSObject<MyProtocol,NewProtocol>
-(void) love;
@end
在Children.h中定义了一个新的方法love,之前我们也一直这样写的,没有任何问题。再看下面一段代码
#import "Children.h"
@implementation Children
-(void) eat{
NSLog(@"eat");
}
-(void) setname{
NSLog(@"Student--setname");
}
-(NSString*) getname{
return @"qingyuan";
}
@end
使用编译器编辑,代码并没有报错。在Children.m中没有love方法的实现。 这个和我们之前所见到的代码似乎有点不一样啊,有点不理解,理论上Children.m中应该实现love方法的。
上面看到的这种情况,就好比Protocol中的@optional方法,是可以选择实现的,其实我们就称作@interface Children : NSObject 就是一个非正式协议。
刚才也注意到了,那是不是Protocol中的@optional标识的方法也就是非正式协议呢。在这里网络上有些争议,个人也没有完全明白,但是个人理解这个还是不一样的。@protocol是一种既定的规则,如果要做就必须遵循这种规则,而@interface有点象描述,用于描述类是干什么的. 而两者因为都可选择实现其他的方法,所以感觉有点类似。
五. 协议总结
Object C 中有点特殊的时协议不引用任何类,任何类都可以实现已经定于好的协议。
bool flag1=[child conformsToProtocol:@protocol(NewProtocol)];
NSLog(@"%d",flag1);
bool flag2=[child conformsToProtocol:@protocol(MyProtocol)];
NSLog(@"%d",flag2);
bool flag3=[child conformsToProtocol:@protocol(ProtocolCom)];
NSLog(@"%d",flag3);
从以上代码可以看得出, conformsToProtocol 方法用于判断某个类是否遵循某个协议,返回值为bool类型,即使协议是通过"继承"过来的也可以。