0

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

4

1 回答 1

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.

正式的方式是协议。我将为A和创建协议B,我将调用APBP。这改变了A和的接口B

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

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

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

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

希望有帮助。

于 2013-08-12T17:18:40.730 回答