object-c学习:协议protocol
2012-03-21 14:09
405 查看
@interface 相当于是Object-C 的类的原型,与JAVA 中的接口意义是不同的,Object-C
中的 @protocol 才是和JAVA 中的接口等价的东西。例如:Object-C 的继承也是单继承,只
允许有一个父类,但是@protocol 是允许多继承的(按照Object-C 的说法叫做某类遵从了协
议A、协议B,而不是继承),这些都与JAVA 的接口一致。java中的interface可以有很多,没有固定的限制。
Printing.h
@protocol Printing1
-(void) print1;
@end
@protocol Printing2
-(void) print2;
@end
@protocol Printing3 <Printing2>
-(void) print3;
@end
Printing3 <Printing2>的意思是Printing3 遵从(继承)Printing2,<>是遵从@protocol 协议的语
法。
Fraction.h
#import <Foundation/Foundation.h>
#import "Printing.h"
@interface Fraction: NSObject <Printing1,Printing3>{
int numerator;
int denominator;
}
-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
Fraction.m
#import "Fraction.h"
@implementation Fraction
-(Fraction*) initWithNumerator: (int) n denominator: (int) d{
self=[super init];
if(self){
[self setNumerator: n];
[self setDenominator: d];
}
}
-(void) setNumerator: (int) n{
numerator=n;
}
-(void) setDenominator: (int) d{
denominator=d;
}
-(int) numerator{
return numerator;
}
-(int) denominator{
return denominator;
}
-(void) print1{
printf("1:%d/%d\n",numerator,denominator);
}
-(void) print2{
printf("2:%d/%d\n",numerator,denominator);
}
-(void) print3{
printf("3:%d/%d\n",numerator,denominator);
}
@end
main.m
#import "Fraction.h"
int main (int argc , const char *argv[]){
Fraction *frac=[[Fraction alloc] initWithNumerator: 3 denominator: 5];
<Printing1> p1=frac;//使用protocol 类型,相当于JAVA 中使用接口类型作为对象
的引用List list=ArrayList 的实例。
//也可以写作 id <Printing1> p1=frac;
[p1 print1];
id<Printing1,Printing2,Printing3> p2=frac;
//从这里可以看出id 是一个泛型对象,在id 后面使用<>作为泛型参数可以明确的
告诉别人你想把id 当作哪些种协议去使用,当然你可以不写泛型参数。
[p2 print2];
[p2 print3];
//-(BOOL) conformsToProtocol: (Protocol*) prot 用于判断对象是否遵从某
个protocol。
if([frac conformsToProtocol: @protocol(Printing1)]
&&[frac conformsToProtocol: @protocol(Printing2)]
&&[frac conformsToProtocol: @protocol(Printing3)]){
printf("YES");
}else{
printf("NO");
}
[frac release];
return 0;
}
中的 @protocol 才是和JAVA 中的接口等价的东西。例如:Object-C 的继承也是单继承,只
允许有一个父类,但是@protocol 是允许多继承的(按照Object-C 的说法叫做某类遵从了协
议A、协议B,而不是继承),这些都与JAVA 的接口一致。java中的interface可以有很多,没有固定的限制。
Printing.h
@protocol Printing1
-(void) print1;
@end
@protocol Printing2
-(void) print2;
@end
@protocol Printing3 <Printing2>
-(void) print3;
@end
Printing3 <Printing2>的意思是Printing3 遵从(继承)Printing2,<>是遵从@protocol 协议的语
法。
Fraction.h
#import <Foundation/Foundation.h>
#import "Printing.h"
@interface Fraction: NSObject <Printing1,Printing3>{
int numerator;
int denominator;
}
-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
Fraction.m
#import "Fraction.h"
@implementation Fraction
-(Fraction*) initWithNumerator: (int) n denominator: (int) d{
self=[super init];
if(self){
[self setNumerator: n];
[self setDenominator: d];
}
}
-(void) setNumerator: (int) n{
numerator=n;
}
-(void) setDenominator: (int) d{
denominator=d;
}
-(int) numerator{
return numerator;
}
-(int) denominator{
return denominator;
}
-(void) print1{
printf("1:%d/%d\n",numerator,denominator);
}
-(void) print2{
printf("2:%d/%d\n",numerator,denominator);
}
-(void) print3{
printf("3:%d/%d\n",numerator,denominator);
}
@end
main.m
#import "Fraction.h"
int main (int argc , const char *argv[]){
Fraction *frac=[[Fraction alloc] initWithNumerator: 3 denominator: 5];
<Printing1> p1=frac;//使用protocol 类型,相当于JAVA 中使用接口类型作为对象
的引用List list=ArrayList 的实例。
//也可以写作 id <Printing1> p1=frac;
[p1 print1];
id<Printing1,Printing2,Printing3> p2=frac;
//从这里可以看出id 是一个泛型对象,在id 后面使用<>作为泛型参数可以明确的
告诉别人你想把id 当作哪些种协议去使用,当然你可以不写泛型参数。
[p2 print2];
[p2 print3];
//-(BOOL) conformsToProtocol: (Protocol*) prot 用于判断对象是否遵从某
个protocol。
if([frac conformsToProtocol: @protocol(Printing1)]
&&[frac conformsToProtocol: @protocol(Printing2)]
&&[frac conformsToProtocol: @protocol(Printing3)]){
printf("YES");
}else{
printf("NO");
}
[frac release];
return 0;
}
相关文章推荐
- object-c学习:协议protocol
- object-c学习:协议 Protocol
- Object-C学习笔记-Protocol(协议)与非正式协议
- Object-C 学习笔记(二十二)--- 协议Protocol
- object-c中的协议@protocol/@required问题
- Object-C中的代理协议Protocol
- 黑马程序员——OC语言学习——ARC机制、block代码块、protocol协议、protocol协议的应用
- iOS阶段学习第19天笔记(协议-Protocol)
- Objective-C学习之旅(七)----协议protocol
- 黑马程序员——OC学习小结------arc,block,protocol(协议)
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol&nbsp
- 【Swift学习笔记00】——enumeration枚举类型遵循协议protocol
- IOS学习第七篇 ——Protocol协议
- 黑马程序员——OC学习之协议protocol的使用
- Swift中的协议(protocol)学习教程
- Object-C之Protocol协议解析
- OC学习之协议(protocol)浅析
- Object-C学习笔录(三)NSKeyValueCoding(KVC)协议与NSKeyValueObserving(KVO)协议
- object-c学习:category 和 protocol区别