我想你可能会问如何声明将实施一段时间后,其他地方的方法。
Objective-C的做法是使用Protocols。
您声明一个协议这样的,通常在头文件
@protocol MyProtocol <NSObject> {
@optional
- (void)optionalMethod;
@required
- (void)requiredMethod;
}
@end
这声明两种方法,一种是可选的,并且需要一个。要使用此协议之前,宣布将实施
@interface MyConformingClass : NSObject <MyProtocol> {
}
// you don't have to redeclare methods that are declared in the protocol
@end
这个新类是在编译时检查的requiredMethod
所以它必须实现它的执行协议中的类时声明的一致性,但它可以选择是否不实施
@interface RequiringClass : NSObject {
MyConformingClass <MyProtocol> *conformingClassObject;
}
…
@end
再次optionalMethod
现在,需要对象的实例,以符合协议的任何类可以声明此,例如,在接口,这是在编译期进行检查
要确保贴合类实现@optional
方法,我们可以用这个结构轻巧的这个
if [conformingClassObject respondsToSelector:@selector(optionalMethod)] {
[conformingClassObject optionalMethod];
} else {
// Do something here because the optional method isn't provided
}
例子遍布可可 - 这是一类可以提供一个列表它希望将其用于委托的操作,委托人采用协议并提供这些委托方法的实现。然后调用对象可以检查这个委托是否在运行时响应这些方法,如上所述,并调用这些方法来执行操作,或者在需要时提供信息。
这在Objective-C中用得相当多,其中类提供了一些他们希望其他类可以执行的方法列表,这与虚拟函数不同,虚函数是类声明函数,它希望子类提供实现。特别是因为组合在语言上优于继承。而不是创建一个提供实现的子类,而是创建另一个可以做同样事情的类,并在该类中添加对该类的引用。
协议类似于Java/C#接口,在C++中,它们最接近于没有数据成员的抽象类以及所有纯虚拟方法。我认为一个协议仅仅是为了在运行时提供实现的单个类声明一个方法而有点矫枉过正。就个人而言,我会为多个类将实现(或不是)相同方法的情况保存协议。 – ipmcc
想想iOS,其中委托用于将数据从堆栈顶部的视图传递到视图控制器。一个常见的做法是委派,这只是一个阶层与另一个阶层之间的渠道。 – Abizern