协议:相当于其他面相对象语言中得抽象类(@optional)或者是接口(@required),弥补面相对象多继承.
于接口的区别:java C# C++中的接口或抽象类可以通过子类实例化对象,进行向上转型,但是协议不能实例化对象.
//
// Car.h
// protocolDemo
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
/*
*定义协议
*相当于其他面相对象语言中得抽象类(@optional)或者是接口(@required)
*/
@protocol Car <NSObject>
//需求:对于车来说不一定要上颜色@optional,但是必须能跑@required
//默认为@required
@required//相当于其他面相对象语言的接口,一定要实现(覆盖)
-(void)run;//上路跑
@optional//相当于其他面相对象语言的抽象类,可选实现(覆盖)
-(void)color;//上颜色
@end
//
// Benz.h
// protocolDemo
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Car.h"
@interface Benz : NSObject<Car>
@end
//
// Benz.m
// protocolDemo
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Benz.h"
@implementation Benz
-(void)run//上路跑
{
NSLog(@"奔驰车正在路上跑");
}
-(void)color//上颜色
{
NSLog(@"奔驰车上了黑颜色");
}
@end
//
// main.m
// protocolDemo
//
// Created by 5016 on 13-12-16.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Benz.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Benz *benz = [[Benz alloc] init];
[benz run];
//判断是否能响应这个方法
if ([benz respondsToSelector:@selector(color)]) {
[benz color];
}
if([benz conformsToProtocol:@protocol(Car)]){
NSLog(@"响应这个协议(实现这个接口)");
}
}
return 0;
}