ios - objective-c 中 "Template method pattern"的实现

标签 ios objective-c

我知道 Objective-C 不支持抽象类,但它仍然是 OO 语言 ( http://en.wikipedia.org/wiki/Objective-C )。因此,我有几个对象具有相同的方法,除了一个之外,我想遵循 DRY 原则,不要在多个类中重复大量相同的代码。最好的方法是什么?

最佳答案

So I have several object with the same methods except one, so I would like to follow DRY principle and don't repeat a lot of the same code in one place.

我假设你的意思是“我有几个,除了一个之外,它们具有相同的方法”。


这取决于您希望整个事情的正式程度。这一切都从一个具有所有常用方法的基类开始。我将其称为@interface A : NSObject .

A 的子类将继承自A

  • @interface A1 : A
  • @interface A2 : A

需要独特方法的子类我将调用 B

  • @interface B : A

您可以在运行时进行测试,看看 A 类的对象是否能够执行该独特的方法。

A *a = ...
if ([a respondsToSelector:@selector(uniqueMethod)])
    [(id)a uniqueMethod];

这是一种非常非正式的方法,如果其他类开始实现该独特方法,将来可能会导致维护问题。

另一个选项是检查类(class)成员资格。

A *a = ...
if ([a isKindOfClass:[B class]])
    [(B *)a uniqueMethod];

这仍然是非正式的,但为 future 的变化提供了更好的保护。它还限制了 future 的灵 active ,因为 A 的其他实例将来可能需要使用独特的方法,但必须重构为 B 的子类.

执行此操作的正式方法是协议(protocol)。我将为 A 创建协议(protocol)和 B我会调用APBP .这会更改 A 的界面和 B .

  • @interface A : NSObject <AP>
  • @interface B : A <BP>

现在测试变成了一致性问题。

A *a = ...
if ([a  conformsToProtocol:@protocol(BP)])
    [(id<BP>)a uniqueMethod];

这可以提供保护和灵 active ,但在未来需要更改时需要进行更多维护工作。

希望对您有所帮助。

关于ios - objective-c 中 "Template method pattern"的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192429/

相关文章:

ios - xcode中标签栏 Controller View 的第一个 View

objective-c - 你如何在 Xcode 中进行 TDD?

ios - 如何在 Objective C 中将 NSURLConnection 更改为 NSURLSession?

ios - 在 Swift 中从另一个 View Controller 中启用 TabBar 项目

ios - Swift - 无法找出崩溃的因素

ios - 弹出窗口中的 CNContactPickerViewController (iOS)

objective-c - 如何在 OS X 上以编程方式运行具有低 IO 优先级和高 niceness 值的命令

ios - Today View Extension(Widget)中的 UISlider

ios - 核心数据问题。数据不会保存

iphone - 导航 Controller 和 View 在返回时不更新