设为首页 加入收藏

TOP

Object C学习笔记15-协议(protocol)(一)
2019-08-31 00:19:33 】 浏览:64
Tags:Object 学习 笔记 15- 协议 protocol

在.NET中有接口的概念,接口主要用于定义规范,定义一个接口关键字使用interface。而在Object C 中@interface是用于定义一个类的,这个和.NET中有点差别。在Object C中有一个协议(protocol) 的概念,这个和 .NET 中的 interface 类似。

协议(Protocol) 在列出的方法在本类中并没有相应实现,而是别的类来实现这些方法,而定义协议必须使用protocol关键字。

 

一. 如何定义protocol的定义

如何使用XCode新建一个协议.h 文件

 

定义协议代码如下:

#import <Foundation/Foundation.h> @protocol ProtocolCom <NSObject>
@required
-(void) eat;
@optional
-(void) write;
@end

 从以上代码可以看到,我们可以了解到定义一个协议基本如下结构: 

@protocol protocolName<NSObject>
@required
//方法声明
@optional
//方法声明
.......
@end

从刚才的代码中,定义了一个名为ProtocolCom的协议,其中有两个方法 eat ,write;  上面也提到过了,protocol相当于.net中的interface 接口,接口就是用于定义规则的,但是Object C中的协议和.NET中的interface还是有点区别的,这里就涉及到@required,@optional 。 这两个标注在方法上面是有特殊含义的,这个后面详细说明。

#import <Foundation/Foundation.h>
@protocol ProtocolCom 
@required
-(void) eat;
@optional
-(void) write;
@end

从上面修改的代码对比来看,在协议定义后面缺少了<NSObject> ,这段代码仍然能够正常运行,其实<NSObject>也本身可以理解为ProtocolCom要遵循NSObject 协议,这个和.NET中一个类如果没有显示指定继承哪个类,那么默认就是继承的Object类的道理是一样的,所以这里可以省略。

这里我在定义一个协议MyProtocol,这个协议必须遵循协议ProtocolCom协议。刚才上面已经了解到了协议后面跟<NSObject>,道理一样如果MyProtocol要遵循协议ProtocolCom就是用此种方式来实现,具体代码如下:

#import <Foundation/Foundation.h>
#import "ProtocolCom.h"
@protocol MyProtocol <ProtocolCom> @required -(void) setname; @optional -(void) setage; @end

在Object C 协议中并不习惯说继承,而是是用遵从或者遵循,比如A协议遵循B协议。这里专业上得术语可能不太准确,姑且这么说,先理解意思。

然后我们是用一个新的类来实现协议 MyProtocol 中的所有方法。

#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface Student : NSObject<MyProtocol>
@end

-------------------------------------------

#import "Student.h"
@implementation Student
-(void) write{
    NSLog(@"write");
}

-(void) eat{
    NSLog(@"eat");
}

-(void) setage{
    NSLog(@"Student---setage");
}

-(void) setname{
    NSLog(@"Student----setname");
}

@end

从以上代码可以看出类Student实现了协议MyProtocol,因为协议MyProtocol遵循协议ProtocolCom,所以协议MyProtocol有四个方法。所以在Student类中可以实现四个方法。

 

二. 协议相关约束

 @required 用于表示协议中该方法必须在类中实现,默认[如果不加则默认为@required]

 @optional 用于表示协议中该方法在类中可以选择实现

 看到这里貌似比.NET中的要高级点,.NET中interface定义的所有方法在子类中都必须实现。如果用@required标识的方法在子类中没有实现那么编译编译会报错,提示该方法必须实现。而@optional则不会。下面这段代码就会存在问题:

#import "Student.h"
@implementation Student
-(void) write{
    NSLog(@"write");
}
-(void) eat{
    NSLog(@"eat");
}
-(void) setage{
    NSLog(@"Student---setage");
}
@end

 

三. 同时遵循多个协议

 在.NET中一个类也可以实现多个接口,在Object C中同样如此,一个类可以实现遵循多个接口,基本语法如下:

 @interface className:parentName<ProtocolName1,ProtocolName2,...>
     ......
 @end

虽然上面简单了点,但是还是能够看明白表达的意思,下面看一段代码说明:

这里从新定义一个新的协议NewProtocol,里面有一个必须实现的方法getname

#import <Foundation/Foundation.h>
@protocol NewProtocol <NSObject>
@required
-(NSString*) getname;
@end

然后从新定义一个新的类Children,这个类必须遵循协议NewProtocol和协议MyProtocol ,具体代码如下:

#import <Foundation/Foundation.h>
#import "MyProtocol.h"
#import "NewProtocol.h"

@interface Children : NSObject<MyProtocol,NewProtocol>
@end

在Children.m代码中要实现两个协议中必须

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目