抽象类在 Objective-C 中很常见,而类簇——在 Cocoa 中广泛使用的模式——是抽象工厂模式的一种变体。
但是,正如您所注意到的,没有语言工具可以将方法或类明确划分为抽象 - 这通常在文档中完成。如果您需要额外的安全措施以确保不会以意外方式使用课程,您可以执行以下操作:
初始化器:
//Invocation of the initializer in a sub-class will not raise the exception.
if ([self class] == [MyAbstractClass class])
{
[NSException raise: . . . class is abstract - use subclass.
}
方法:
- (BOOL)someAbstractMethod
{
[NSException raise:NSInvalidArgumentException format:@"%@ is abstract",
NSStringFromSelector(_cmd)];
return NO;
}
协议与抽象基础
我不同意其他一些答案中提出的“最好使用协议”的说法。虽然可以将抽象基类与协议结合起来,但不一定更好。
何时使用协议
使用协议来指定集成合约——比如插件架构。一个例子是“媒体播放器”,其中电影和音频流的“播放”实现将完全不同。
何时使用抽象基类(或类簇)
当类层次结构之间的某些行为是共享的,并且某些实现细节在特定子类型之间有所不同时,请使用抽象基类。. 在这里使用协议不一定更好,除非您希望传达这组方法可交换为另一个实现的意图。
类集群:
使用类集群,获取其中一种子类型的实例的工厂方法位于基类本身上。有时这会产生可读性和内聚性很好的代码。(可能与您的具体示例无关,但与 Objective-C 中的抽象类有关的一个有趣点)