ios - 创建更好的面向对象设计

标签 ios objective-c

我有以下类(class):

Teacher
Student
Class (like a school class)

它们都从具有以下代码的 KObject 扩展:

- initWithKey
- send
- processKey

Teacher、Student 类都使用 KObject 父类的 processKey 和 initWithKey 函数。他们实现了自己的 send 版本。我遇到的问题是 KObject 不应该被实例化。它更像是一个抽象类,但是objective-c中没有抽象类的概念。它仅适用于允许子类访问一个属性和两个函数。

如何才能使 KObject 无法实例化,但仍允许子类访问 KObject 的函数和属性?

最佳答案

抽象类在 Objective-C 中非常常见, class cluster - 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;
}

协议(protocol)与抽象基础

我不同意其他一些答案中的“最好使用协议(protocol)”的说法。虽然可以将抽象基类与协议(protocol)结合起来,但这并不一定更好。

何时使用协议(protocol)

使用协议(protocol)来指定集成契约 - 就像插件架构一样。一个例子是“媒体播放器”,其中实现电影音频的“播放” > 流会完全不同。

何时使用抽象基类(或类簇)

当类层次结构之间的某些行为是共享的,并且某些实现细节在特定子类型之间有所不同时,请使用抽象基类。 。在这里使用协议(protocol)并不一定更好,除非您希望传达这组方法可以替换为另一个实现的意图。

类簇:

对于类簇,用于获取子类型之一实例的工厂方法位于基类本身上。有时这会产生良好的可读性和凝聚力的代码。 (可能与您的具体示例无关,但与 Objective-C 中的抽象类相关的一个有趣点)

关于ios - 创建更好的面向对象设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472668/

相关文章:

objective-c - 如何以编程方式创建分割 View ?

iphone - CALayer 与 drawInRect : performance?

iphone - cocoa - 数组不排序?

objective-c - 将文本字段的值放入另一个字符串

objective-c - 抑制 XCode Analyzer 对象存储到 .. 错误中的潜在泄漏

ios - FileHandle 在 iOS 中不释放内存

ios - SwipeCellKit 无法正常工作

ios - 在 prepareForInterfaceBuilder() 中调用 awakeFromNib()

ios - SWIFT:为什么我无法在 UIWebView 中加载当前 URL?

ios - 从 layoutSubviews 访问上一个单元格