在Object-C中,Protocol被用来定义一组独立于具体类的属性和方法,其不具体实现这些方法,任何类都可以实现Protocol,Protocol可以继承另一个Protocol,从特征上看Protocol的作用类似于Java世界的接口。
Protocol在具体的使用过程中基本上采用了“Delegation”模式,即采用Protocol定义方法,然后不同的类使用不同的具体实现,从而完成某个行为的多态。 在iOS的SDK类库中大量使用了这样的Delegate的模式,比方说UITableViewDataSource定义了Table View如何使用数据源的一系列方法,开发者需要使用Table View时,就需要实现这一系列方法,然后把自己定义的Table View delegate给当前对象。这样,不同界面的Table View就可以基于自身对象的实现做不同的展现。
定义protocol非常简单,如下:
Object-c代码
- @protocol MyProtocol <NSObject>
- // pst of methods and properties
- [url=home.php?mod=space&uid=10695]@END[/url]
除此之外,protocol定义时,还支持2个关键字,@required和@optional。顾名思义:凡是在@required后面的方法,实现该protocol的类必须实现,optional后面的方法可以不实现。默认所有的方法和属性都是@required的。
Object-c代码
- @protocol MyProtocol <NSObject>
- // pst of methods and properties
- @required
- // pst of methods and properties
- @optional
- // pst of methods and properties
- @end
另外,protocol还可以继承另一个protocol。
Object-c代码
- @protocol A
- -(void)methodA;
- @end
- @protocol B <A>
- -(void)methodB;
- @end
实现protocol也非常简单, 在Object-C中,一个类要使用某个protocol,只需要在类定义时加上‘<ProtocolName,...>’就行了。
Object-c代码
- @interface MyClass : NSObject <MyProtocol, AnotherProtocol, YetAnotherProtocol>
- ...
- <A href="mailto:.@end">@end</A>
最后,和Java中的接口一样,一旦某个对象实现了某个protocol, 那么就可以用该protocol的指针来指向该对象。这就是为什么当当前对象实现了UITableViewDataSource protocol,就可以把Table View的delegate赋值给当前对象。 在UITableView的代码中,dataSource属性的定义是这个样子的。
- Object-c代码
- ....
- id <UITableViewDataSource> _dataSource;
- &helpp;