设为首页 加入收藏

TOP

Object C学习笔记15-协议(protocol)(二)
2019-08-31 00:19:33 】 浏览:66
Tags:Object 学习 笔记 15- 协议 protocol
实现的方法

#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类型,即使协议是通过"继承"过来的也可以。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇iOS-关于缓存【SDImageCache】Ima.. 下一篇weex中UISegmentControl实现及遇..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目