Object-C技术学习,更多资源请访问 https://www.itkc8.com
// main.m
// 正式协议的定义
//
// Created by Goddog on 15/1/11.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
/*
1.正式协议的定义不再采用@interface、@implementation关键字,而是使用@protocol关键字,
如@protocol 协议名 <父协议1,父协议2> {零到多个方法定义...}
2.协议的具体要求:(1)协议名应该与类名采用相同的命名规则。
(2)一个协议可以有多个直接父协议,但协议只能继承协议,不能继承类。
(3)协议中定义的方法只有方法的签名,没有方法的实现,协议中的方法可以是类方法,也可以是实例方法。
3.协议的继承与类的继承不一样,协议完全支持多继承,即一个协议可以有多个直接的父协议。
4.遵守协议:在类定义的接口部分可指定该类继承的父类,以及遵守的协议,语法为@interface 类名:父类<协议1,协议2...>
5.使用协议定义变量的方法:(1)NSObject<协议1,协议2...>* 变量;
(2)id<协议1,协议2...> 变量;
6.如果使用协议来定义变量,那么这些变量只能调用该协议中声明的方法,否则编译错误。
7.正式协议与非正式协议: (1)非正式协议用NSObject创建类别来实现,而正式协议则用@protocol创建。
(2)遵守非正式协议通过继承带特定类别的NSObject来实现,而遵守正式协议有专门的OC语法。
(3)遵守非正式协议不要求实现协议中定义的所有方法,遵守正式协议必须实现协议中定义的所有方法。
8.但是从OC2.0开始增加了:(1)@optional:实现类即可选择实现这些方法,也可选择不实现这些方法。
(2)@required:实现类必须实现这些方法。
9.有了@optional和@required关键字之后,正式协议完全可以替代非正式协议。
*/
//
// Women.h
// 正式协议的定义
//
// Created by Goddog on 15/1/11.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol Women <NSObject>
//定义协议的方法
@optional //可以不实现该接口的方法
-(void) pretty;
@required //必须实现该接口的方法
-(void) beautiful:(NSString*) count;
@end
//
// Man.h
// 正式协议的定义
//
// Created by Goddog on 15/1/11.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol Man <NSObject>
//定义协议的方法
-(void) handsome;
@end
//
// Person.h
// 正式协议的定义
//
// Created by Goddog on 15/1/11.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Women.h"
#import "Man.h"
//协议继承了Women、Man协议
@protocol Person <Women,Man>
//定义协议的方法
-(NSString*) play;
@end
//
// SuperMan.h
// 正式协议的定义
//
// Created by Goddog on 15/1/11.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
@interface SuperMan : NSObject<Person> //实现Person的协议
@end
//
// SuperMan.m
// 正式协议的定义
//
// Created by Goddog on 15/1/11.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import "SuperMan.h"
#define MAX_CACHE_LINE 10
@implementation SuperMan
{
NSString* playData[MAX_CACHE_LINE]; //使用数组记录所有需要缓存的数据
int dataNum; //记录当前的数量
}
//实现协议方法
-(void) pretty
{
//只要还有漂亮的,继续上
while (dataNum > 0) {
NSLog(@"正在和%@玩%@",playData[0],[self play]);
//剩下的人数减少
dataNum --;
//把列队整体向前移
for (int i = 0; i < dataNum; i++) {
playData[i] = playData[i + 1];
}
}
}
//实现协议方法
-(void) beautiful:(NSString *)count
{
if (dataNum >= MAX_CACHE_LINE) {
NSLog(@"人数已满,不要在上了!");
}
else
{
//把人数添加到列队中
playData[dataNum++] = count;
}
}
//实现协议方法
-(void) handsome
{
NSLog(@"英俊");
}
//实现协议方法
-(NSString*) play
{
return @"游戏";
}
@end
#import <Foundation/Foundation.h>
#import "SuperMan.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建超人对象
SuperMan* superMan = [[SuperMan alloc] init];
//调用协议的方法
[superMan beautiful:@"乌克兰美女"];
[superMan beautiful:@"白俄罗斯美女"];
[superMan pretty];
[superMan handsome];
//创建超人对象,当成Man使用
NSObject<Man>* man = [[SuperMan alloc] init];
//调用Man协议中定义的方法
[man handsome];
//创建超人对象,当成Women使用
id<Women> women = [[SuperMan alloc] init];
//调用Women协议中定义的方法
[women beautiful:@"俄罗斯美女"];
[women pretty];
//[women handsome];//这样是不能调用的
}
return 0;
}
Object-C技术学习,更多资源请访问 https://www.itkc8.com