关闭

object-c学习:协议protocol

2619人阅读 评论(0) 收藏 举报

 @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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:438155次
    • 积分:4457
    • 等级:
    • 排名:第6913名
    • 原创:20篇
    • 转载:75篇
    • 译文:2篇
    • 评论:71条
    文章分类
    最新评论