在目标c中实现“模板方法模式”

时间:2013-08-12 16:49:27

标签: ios objective-c

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

1 个答案:

答案 0 :(得分:1)

  

所以我有几个对象使用相同的方法,除了一个,所以我想遵循DRY原则,不要在一个地方重复很多相同的代码。

我认为你的意思是"我有几个使用相同的方法,除了一个"。


这取决于你想要对整个事情的正式程度。这一切都始于一个具有所有常用方法的基类。我会称之为@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];

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

另一种选择是检查班级成员资格。

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

这仍然是非正式的,但可以更好地保护未来的变化。它还限制了未来的灵活性,因为A的其他实例可能需要在将来使用唯一方法,但必须重构为B的子类。

执行此操作的正式方法是协议。我将为AB创建协议,我将调用APBP。这会更改AB的接口。

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

现在,测试成为一致的问题。

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

这允许保护和灵活性,但是在需要进行未来更改时需要更多工作。

希望有所帮助。