我知道Objective-C不支持抽象类,但它仍然是OO语言(http://en.wikipedia.org/wiki/Objective-C)。所以我有几个对象使用相同的方法,除了一个,我想遵循DRY原则,不要在几个类中重复很多相同的代码。最好的方法是什么?
答案 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
的子类。
执行此操作的正式方法是协议。我将为A
和B
创建协议,我将调用AP
和BP
。这会更改A
和B
的接口。
@interface A : NSObject <AP>
@interface B : A <BP>
现在,测试成为一致的问题。
A *a = ...
if ([a conformsToProtocol:@protocol(BP)])
[(id<BP>)a uniqueMethod];
这允许保护和灵活性,但是在需要进行未来更改时需要更多工作。
希望有所帮助。