objective-c中的protocol跟java中的接口interface和c++中的纯虚类(purely virtual class)一样,本质都是用于一个类需要遵循的某个通信协议,从这个意义上看,
protocol的定义非常简单,基本遵循以下的格式即可:
@protocol ProtocolName
//Here is protocol method list that you must implement
@end
二,protocol如何使用?
某个类要遵循(conforms)某个protocol,将要遵循的protocols放到<>里面,并且多个protocol用逗号分开,如下:
@interface SomeClass <protocol1, protocol2>
@end
看起来是否有点像c++中的模板类?
三,关于protocol其他的一些约定
1,protocol中的方法不需要再次在interface声明里面出现,因为protocol里面已经进行了声明,但需要在implementation中进行实现。
而是可以通过id类型加上protocol的方式进行制定,如: id<Printing> somevar = someobj, 你还可以动态的指定遵循多个protocol的类型,
返回一个YES的BOOL对象,对class也一样:[someclass conformsToProtocol:@protocol(someprotocol)]
四,一个例子:来自《Objective-c_简体中文手册》
//这个是定义一个protocol的方法
1,Printing.h:
@protocol Printing
-(void) print;
@end
2,Fraction.h:
#import <Foundation/NSObject.h>
#import "Printing.h"
//可以看出protocol Printing 中的方法:print没有出现在下面的method列表中
@interface Fraction: NSObject <Printing, NSCopying> {
int numerator;
int denominator;
}
-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(void) setNumerator: (int) d;
-(void) setDenominator: (int) d;
-(void) setNumerator: (int) n andDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
3,Fraction.m
#import "Fraction.h"
#import <stdio.h>
@implementation Fraction
-(Fraction*) initWithNumerator: (int) n denominator: (int) d {
self = [super init];
if ( self ) {
[ self setNumerator: n andDenominator: d];
}
return self;
}
//注意:protocol中的方法需要在这里进行实现
-(void) print {
printf( "%i/%i", numerator, denominator );
}
-(void) setNumerator: (int) n {
numerator = n;
}
-(void) setDenominator: (int) d {
denominator = d;
}
-(void) setNumerator: (int) n andDenominator: (int) d {
numerator = n;
denominator = d;
}
-(int) denominator {
return denominator;
}
-(int) numerator {
return numerator;
-(Fraction*) copyWithZone: (NSZone*) zone {
return [[Fraction allocWithZone: zone] initWithNumerator: numerator denominator: denominator];
}
@end
4,main.m
#import <stdio.h>
#import "Fraction.h"
int main( int argc, const char *argv[] ) {
// create a new instance
Fraction *frac = [[Fraction alloc] initWithNumerator: 3 denominator: 10];
//这里展示了如何用id加protocol的方式进行对象的引用
id <Printing> printable;
id <NSCopying, Printing> copyPrintable;
// print it
printable = frac;
printf( "The fraction is: " );
[printable print];
printf( "\n" );
// this compiles because Fraction comforms to both Printing and NSCopyable
copyPrintable = frac;
// true
if ( [frac conformsToProtocol: @protocol( NSCopying )] == YES ) {
printf( "Fraction conforms to NSCopying\n" );
}
// free memory
objective-c的协议说法可能更加恰当。
protocol的定义非常简单,基本遵循以下的格式即可:
@protocol ProtocolName
//Here is protocol method list that you must implement
@end
二,protocol如何使用?
某个类要遵循(conforms)某个protocol,将要遵循的protocols放到<>里面,并且多个protocol用逗号分开,如下:
@interface SomeClass <protocol1, protocol2>
@end
看起来是否有点像c++中的模板类?
三,关于protocol其他的一些约定
1,protocol中的方法不需要再次在interface声明里面出现,因为protocol里面已经进行了声明,但需要在implementation中进行实现。
也就是说protocol要求实现的methods不需要再次放到header文件的methods列表,但需要放在对应的m文件中进行实现。
而是可以通过id类型加上protocol的方式进行制定,如: id<Printing> somevar = someobj, 你还可以动态的指定遵循多个protocol的类型,
却从头到尾只需用一个变量:<Printing, NSCopying> somevar = someobj;
返回一个YES的BOOL对象,对class也一样:[someclass conformsToProtocol:@protocol(someprotocol)]
四,一个例子:来自《Objective-c_简体中文手册》
//这个是定义一个protocol的方法
1,Printing.h:
@protocol Printing
-(void) print;
@end
2,Fraction.h:
#import <Foundation/NSObject.h>
#import "Printing.h"
//可以看出protocol Printing 中的方法:print没有出现在下面的method列表中
@interface Fraction: NSObject <Printing, NSCopying> {
int numerator;
int denominator;
}
-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(void) setNumerator: (int) d;
-(void) setDenominator: (int) d;
-(void) setNumerator: (int) n andDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
3,Fraction.m
#import "Fraction.h"
#import <stdio.h>
@implementation Fraction
-(Fraction*) initWithNumerator: (int) n denominator: (int) d {
self = [super init];
if ( self ) {
[ self setNumerator: n andDenominator: d];
}
return self;
}
//注意:protocol中的方法需要在这里进行实现
-(void) print {
printf( "%i/%i", numerator, denominator );
}
-(void) setNumerator: (int) n {
numerator = n;
}
-(void) setDenominator: (int) d {
denominator = d;
}
-(void) setNumerator: (int) n andDenominator: (int) d {
numerator = n;
denominator = d;
}
-(int) denominator {
return denominator;
}
-(int) numerator {
return numerator;
}
-(Fraction*) copyWithZone: (NSZone*) zone {
return [[Fraction allocWithZone: zone] initWithNumerator: numerator denominator: denominator];
}
@end
4,main.m
#import <stdio.h>
#import "Fraction.h"
int main( int argc, const char *argv[] ) {
// create a new instance
Fraction *frac = [[Fraction alloc] initWithNumerator: 3 denominator: 10];
//这里展示了如何用id加protocol的方式进行对象的引用
id <Printing> printable;
id <NSCopying, Printing> copyPrintable;
// print it
printable = frac;
printf( "The fraction is: " );
[printable print];
printf( "\n" );
// this compiles because Fraction comforms to both Printing and NSCopyable
copyPrintable = frac;
// true
if ( [frac conformsToProtocol: @protocol( NSCopying )] == YES ) {
printf( "Fraction conforms to NSCopying\n" );
}
// free memory
[frac release];
return 0;}