Objective-c中的protocol

        objective-c中的protocol跟java中的接口interface和c++中的纯虚类(purely virtual class)一样,本质都是用于一个类需要遵循的某个通信协议,从这个意义上看,

objective-c的协议说法可能更加恰当。


 一,如何定义protocol?
       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文件中进行实现。


   2,objective-c的接口系统有一个独一无二的概念是如何制定一个类别,不像c/c++那样,Printing * somevar = (Printing *) someobj,
   而是可以通过id类型加上protocol的方式进行制定,如: id<Printing> somevar = someobj, 你还可以动态的指定遵循多个protocol的类型,

   却从头到尾只需用一个变量:<Printing, NSCopying> somevar = someobj;


   3,就像使用@selector来测试对象的继承关系,你可以使用@protocol来测试一个对象是否遵循某个协议,如果遵守,[someobject                  conformsToProtocol:@protocol(someprotocol)] 则会
   返回一个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;

}


//注意:这个是实现NSCopying protocol中的方法
-(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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值