我不确定是否应该创建一个抽象类和一系列继承这个抽象类的子类,还是定义一个协议。在Cocoa中,什么是最佳实践呢?
我不确定是否应该创建一个抽象类和一系列继承这个抽象类的子类,还是定义一个协议。在Cocoa中,什么是最佳实践呢?
这取决于具体情况。
Cocoa术语中,抽象类+子类模式被称为类群。其中著名的例子包括NSString
和NSArray
。这种方法的主要优点是,您可以在基类上实现方法,这些方法可以继承并以核心方法集进行工作;例如,NSString
的子类只需要为-length
和-characterAtIndex:
实现就可以让所有公共NSString
实例方法工作(尽管效率不高)。
这种模式的缺点是实现必须从基类继承,这可能会成为单继承语言中的严重限制。
另一方面,协议可以由任何类采用,但不能提供基本实现。它很像鸭子类型的静态检查版本;通过采用协议,您声称您能够“嘎嘎地叫”,而通过要求一个协议,您可以将参数限制为具有“嘎嘎”能力的类,而无需指定特定的基类。
如果您计划为您的抽象提供标准的实现集,则可能需要一个类群。如果您想与实现您的抽象的开放对象集通信,则可能需要一个协议。
我推荐一本书叫做Cocoa Design Patterns,这是一本非常好的书,可以查阅Cocoa框架的工作方式以及使用的范例。