obj-c编程08:分类和协议
篇文章里我们来聊聊如何扩展一个类的方法和实例变量,我们首先来看一下命名分类如何扩展一个类。在下面的代码中,首先定义一个类Player用来定义普通球员,如果第三方开发者发现普通球员缺少了一些方法,则可以用分类ext来扩充喽:
:默认的Player类
Player.h文件:
#import<Foundation/Foundation.h>
@interfacePlayer:NSObject{
intnumber;
intage;
}
-(void)show;
-(id)init:(int)n:(int)age;
@end
Player.m文件:
#import"Player.h"
@implementationPlayer
-(id)init:(int)n:(int)age_v{
self= [super init];
if(self){
number= n;
age= age_v;
}
returnself;
}
-(void)show{
NSLog(@"playerx ,number:%d,age:%d",number,age);
}
@end
test.m文件:
#import"Player.h"
intmain(int argc,char **argv)
{
@autoreleasepool{
Player*p = [[Player alloc] init: 1 :20];
[pshow];
}
return0;
}
编译执行结果如下:
apple@kissAir:Player$clang -fobjc-arc -framework Foundation
Player.m test.m -o main
apple@kissAir:Player$./main
2014-06-3017:55:56.053 main[3862:507] player
x ,number:1,age:20
现在一个第三方软件公司觉得球员球员太不活泼,so他们决定给球员添加方法say和train:
Player_ext.h文件
#import"Player.h" @interfacePlayer (ext) //@propertyint power; //-(id)init:(int)n:(int)age :(int)power; -(void)say; -(void)train; @end
Player_ext.m文件
#import"Player_ext.h"
@implementationPlayer (ext)
//@synthesizepower;
/*
-(id)init:(int)n :(int)age_v :(int)pow{
self= [super init :n :age_v];
if(self){
power= pow;
}
returnself;
}
*/
-(void)say{
NSLog(@"player[n:%d]want to say : hello!",number);
}
-(void)train{
NSLog(@"player[n:%d]is training...",number);
}
@end
test.m文件
//#import"Player.h"
#import"Player_ext.h"
intmain(int argc,char **argv)
{
@autoreleasepool{
Player*p = [[Player alloc] init: 1 :20];
[pshow];
[psay];
[ptrain];
}
return0;
}
我们编译运行看看结果咯:
apple@kissAir:Player$clang -fobjc-arc -framework Foundation
Player.m Player_ext.mtest.m -o main
apple@kissAir:Player$./main
2014-06-3018:16:09.050 main[4246:507] player
x ,number:1,age:20
2014-06-3018:16:09.052 main[4246:507] player[n:1]
want to say : hello!
2014-06-3018:16:09.053 main[4246:507] player[n:1]
is training...
我们发现在命名分类中试图添加实例变量是不允许的,只能在未命名分类中添加,而且未命名分类中声明方法的实现只能放在主类的实现中。下面修改代码,增加power属性,并且train动作是要耗费power的,遂修改该方法,同时新增init方法如下:
@implementation Player (ext)
//@synthesize power;
/*
-(id)init :(int)n :(int)age_v :(int)pow{
self = [super init :n :age_v];
if(self){
power = pow;
}
return self;
}
*/
-(void)say{
NSLog(@"player[n:%d] want to say : hello!",number);
}
-(void)train{
NSLog(@"player[n:%d:pow:%d] is training...power is down to %d",\
number,self.power,self.power -= 10);
}
Player.h文件
#import <Foundation/Foundation.h>
@interface Player:NSObject{
int number;
int age;
}
-(void)show;
-(id)init:(int)n :(int)age;
@end
@interface Player ()
@property int power;
-(id)init :(int)n :(int)age :(int)power;
@end
Player.m文件
#import "Player.h"
@implementation Player
@synthesize power;
-(id)init:(int)n :(int)age_v{
self = [super init];
if(self){
number = n;
age = age_v;
}
return self;
}
-(id)init :(int)n :(int)age_v :(int)pow{
self = [super init];
if(self){
self = [self init :n :age_v];
power = pow;
}
return self;
}
-(void)show{
NSLog(@"player x ,number:%d,age:%d,power:%d",number,age,power);
}
@end
test.m文件
#import "Player_ext.h"
int main(int argc,char **argv)
{
@autoreleasepool{
Player *p = [[Player alloc] init: 1 :20 :100];
[p show];
[p say];
[p train];
[p show];
}
return 0;
}
编译运行结果如下:
apple@kissAir: Player$clang -fobjc-arc -framework Foundation Player.m Player_ext.m test.m -o main
apple@kissAir: Player$./main
2014-06-30 18:52:29.237 main[4822:507] player x ,number:1,age:20,power:100
2014-06-30 18:52:29.239 main[4822:507] player[n:1] want to say : hello!
2014-06-30 18:52:29.240 main[4822:507] player[n:1:pow:100] is training...power is down to 90
2014-06-30 18:52:29.240 main[4822:507] player x ,number:1,age:20,power:90
有球员就有教练啊,现在添加教练类。教练类和球员类有共性的地方哦,就是都有say和train方法。这个共性的地方不妨就用协议来描述吧,需要说明的是教练还有一个召开发布会方法,该方法球员是没有的,我们把它作为一个可选方法放入协议。为了方便就把教练类放在test.m中喽:
Player.h文件
#import <Foundation/Foundation.h>
@protocol Actions
-(void)say; //必须存在
@optional
-(void)convoke; //可选方法
@required
-(void)train; //必须存在
@end
@interface Player:NSObject{
int number;
int age;
}
-(void)show;
-(id)init:(int)n :(int)age;
@end
@interface Player ()
@property int power;
-(id)init :(int)n :(int)age :(int)power;
@end
Player_ext.h文件
#import "Player.h" @interface Player (ext) <Actions> //@property int power; //-(id)init:(int)n :(int)age :(int)power; -(void)say; -(void)train; @end
test.m文件
//#import "Player.h"
#import "Player_ext.h"
@interface Coach:NSObject <Actions>
@end
@implementation Coach
-(void)say{
NSLog(@"coach say : hello!");
}
-(void)train{
NSLog(@"coach is leading train...");
}
-(void)convoke{
NSLog(@"coach is convoking a meeting...");
}
@end
int main(int argc,char **argv)
{
@autoreleasepool{
Player *p = [[Player alloc] init: 1 :20 :100];
Coach *c = [[Coach alloc] init];
[p show];
[c say];
[c convoke];
[c train];
[p say];
[p train];
[p show];
}
return 0;
}
编译运行结果如下:
apple@kissAir: Player$./main
2014-06-30 20:33:24.930 main[6466:507] player x ,number:1,age:20,power:100
2014-06-30 20:33:24.932 main[6466:507] coach say : hello!
2014-06-30 20:33:24.933 main[6466:507] coach is convoking a meeting...
2014-06-30 20:33:24.933 main[6466:507] coach is leading train...
2014-06-30 20:33:24.934 main[6466:507] player[n:1] want to say : hello!
2014-06-30 20:33:24.934 main[6466:507] player[n:1:pow:100] is training...power is down to 90
2014-06-30 20:33:24.934 main[6466:507] player x ,number:1,age:20,power:90
如果要添加多个协议语法为: @interface A <p_a,p_b>
最后我们可以用反射方法测试类是否遵守协议:
Protocol *actions = @protocol(Actions);
Player *p = [[Player alloc] init: 1 :20 :100];
Coach *c = [[Coach alloc] init];
if([p conformsToProtocol: actions]){
NSLog(@"Player abide protocol Actions"); //Coach同样遵守
}
//对于可选方法我们可以用一般的respondsToSelector方法来测试:
if([c respondsToSelector :@selector(convoke)]){
NSLog(@"Coach has convoke method");
}
obj-c编程08:分类和协议的更多相关文章
- 嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...
- 老雷socket编程之认识常用协议
老雷socket编程之常见网络协议 1.ip IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西, 它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求. ...
- Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver
今日内容:socket网络编程 1.OSI七层协议 2.基于tcp协议的套接字通信 3.模拟ssh远程执行命令 4.tcp的粘包问题及解决方案 5.基于udp协议的套接字 ...
- 04OC之分类Category,协议Protocol,Copy,代码块block
一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...
- 【Objective-C 基础】4.分类和协议
1.分类 OC提供了一种与众不同的方式--Category,可以动态的为已经存在的类添加新的行为(方法) 这样可以保证类的原始设计规模较小,功能增加时再逐步扩展. 使用Category对类进行扩展时, ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- Objective-C语言分类与协议
分类(Category)允许向一个类文件中添加新的方法声明,它不需要使用子类机制,并且在类实现的文件中的同一个名字下定义这些方法.其语法举例如下: #import "ClassName.h& ...
- iOS开发笔记系列-基础5(分类和协议)
分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ...
随机推荐
- 【环境配置】配置maven
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺 ...
- 【移动开发】AIDL中callback的实现
AIDL实现就可以在客户端中调用服务端的方法,并传递数据到服务端,也可以服务端传递数据过来:但是如果要从服务端去调用客户端的方法,那么就需要注册callback! 抄自和源码:http://zxl-o ...
- CentOS一般用户和root用户之间的切换
如果终端提示符显示为"$",表明该用户为普通用户.输入su,回车,然后输入root密码,即可切换到root用户.如果是root用户想切换回普通用户,输入"su 用户名&q ...
- 【Unity技巧】四元数(Quaternion)和旋转
四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...
- android开发之broadcast学习笔记
android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...
- 08 ListView 优化
ListVie的优化 1 固定ListView长宽高 如下图在清单文件中: <ListView android:id="@+id/lv" android:layout_wid ...
- Oracle EBS R12经验谈(二)
作者: jianping.ni 时间: 2009-2-13 12:52 标题: Oracle EBS R12经验谈(二) OAF页面:银行帐户开户人LOV值列表无值 在输入 应付超 ...
- Asp.net实现下拉框和列表框的连动
走过了牛腩老师的新闻发布系统,漫游过了孙鑫老师的Html,在427沐浴第一缕冬日阳光的美丽月底,小编迎来了北大青鸟的Asp.net,北大青鸟,高大上的赶脚有么有,哈哈哈,开始了小编的.net之旅. 首 ...
- 【leetcode75】Intersection of Two Arrays(数组的交集)
题目描述: 给定两个数组求他们的公共部分,输出形式是数组,相同的元素只是输出一次 例如: nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2]. 原文描述: ...
- C++ Primer 有感(new和delete表达式)
定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.取而代之的是,new表达式返回指向性创建的指针. 1.动态创建对象的默认初始化 对于类类型的对象,用该类 ...