协议
协议(Protocol)与Java的Interface(接口) 或者 C++的 纯虚类相同,就是用来声明接口的。协议只是定义了方法的列表,协议不负责实现方法,目的是让别的类来实现。
Graphics协议
Graphics中定义了onDraw方法,但是我们仔细分析一下 onDraw方法不能实现的,作为Graphics(几何图形)它无法知道它的子类如何绘制图形,它只能规定绘制图名字为onDra w签名和返回值等信息,但不能给出具体的实现,因此
Graphics(几何图形)不应该设计成为类而应该设计成为 协议。
Graphics.h
@protocol Graphics
-(void) onDraw;
@end
说明
协议只有接口部分,没有实现部分,所以没有m文件,关键字 @protocol,协议可以继承别的协议,协议中不能定义成员变量。
协议实现类Ellipse
Ellipse.h
#import <Foundation/Foundation.h>
#import "Graphics.h"
@interface Ellipse:NSObject <Graphics> {
}
@end
Ellipse.m
#import "Ellipse.h"
@implementation Ellipse
-(void)onDraw {
NSLog(@"绘制椭圆形");
}
@end
协议实现类Triangle
Triangle.h
#import <Foundation/Foundation.h>
#import "Graphics.h"
@interface Triangle:NSObject <Graphics> {
}
@end
Triangle.m
#import "Triangle.h"
@implementation Triangle
-(void)onDraw {
NSLog(@"绘制三角形");
}
@end
调用的main函数
#import <Foundation/Foundation.h>
#import "Graphics.h"
#import "Ellipse.h"
#import "Triangle.h"
int main (int argc, const char * argv[]) {
id graphics;
graphics = [[Ellipse alloc] init];
[graphics onDraw];
[graphics release];
graphics = [[Triangle alloc] init];
[graphics onDraw];
[graphics release];
return 0;
}
运行 结果
绘制椭圆形 绘制三角形
小结
协议的实现是在类声明的父类之后,加上
<Graphics>
,与 类的单个继承不同,协议可以实现多个,表示要实现这个协议,如果有多个协议要实现用“,”号分隔:<P1,P2>
。
两个协议重要的协议
• NSCopying
• NSCoding
@required和@optional关键字
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
@optional 表示可选择实现
@required 表示必须实现