黑马程序员技术交流社区

标题: ios基础 [打印本页]

作者: luronghua    时间: 2016-7-19 22:31
标题: ios基础
协议和代理:

协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,计划由其他人来实现。

协议提供了一种方式,用指定的名称定义一组多少有点相关的方法。

如果决定实现特定协议的所有方法,也就意味着要遵守(confirm to)或采用(adopt)这项协议。

定义一个协议很简单:只要使用@protocol指令,然后跟上你给出的协议名称。例如:

@protocol NSCoping

- (id) copyWithZone: (NSZone *) zone;

@end



通过在@interface行的一对尖括号(<....>)内列出协议名称,可以告知编译器你正在采用的一个协议。这项协议的名称放在类名和它的父类名称之后,例如:

@interface AddressBook:NSObject<NSCoping>



如果你的类采用多项协议,只需把它们都列在尖括号中,并用逗号分开,例如:

@interface AddressBook:NSObject<NSCoping, NSCoding>



如果你定义了自己的协议,那么不必由自己实现它。如果一个类遵守NSCoping协议,则它的子类也遵守NSCoping协议(不过并不意味着对该子类而言,这些方法得到了正确的实现)。

@protocol Drawing

-(void) paint;

@required

-(void) erase;

@optional

-(void) outline;

@end

注意,这里使用了@optional指令。该指令之后列出的所有方法都是可选的。@required指令之后的是需要的方法。



注意,协议不引用任何类,它是无类的(classless)。任何类都可以遵循Drawing协议。

可以使用conformsToProtocol:方法检查一个对象是否遵循某些协议。例如:

if ([currentObject conformsToProtocol:@protocol (Drawing)] == YES) {

...

}



这里使用的专用@protocol指令用于获取一个协议名称,并产生一个Protocol对象。

通过在类型名称之后的尖括号中添加协议名称,可以借助编译器来检查变量的一致性。例如:

id <Drawing> currentObject;

id <NSCoping, NSCoding> myDocument;

定义一项协议时,可以扩展现有协议的定义。如:

@protocol Drawing3D <Drawing>



代理:

协议也是一种两个类之间的接口定义。定义了协议的类可以看做是将协议定义的方法代理给了实现它们的类。

非正式(informal)协议:是一个分类,列出了一组方法但并没有实现它们。因此,非正式分类通常是为根类定义的。有时,非正式协议也称为抽象(abstract)协议。

非正式协议实际上只是一个名称下的一组方法。

声明非正式协议的类自己并不实现这些方法,并且选择实现这些方法中的子类需要在它的接口部分重新声明这些方法,同时还要实现这些方法中的一个或多个。

注意:前面描述的@optional指令添加到了Objective-C 2.0语言中,用于取代非正式协议的使用。



合成对象(面向对象的那个合成吧):

可以定义一个类包含其他类的一个或多个对象。这个新类的对象就是所谓的合成(composite)对象,因为它是由其他对象组成的。

子类依赖于父类,改变了父类有可能会使得子类中的方法不能工作。


0





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2