我知道 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
我会调用AP
和 BP
.这会更改 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/