0

我有以下类/协议:

@interface Super
@end
@implementation Super
@end
@interface Sub1
@end
@implementation Sub1
@end
@interface Sub2
@end
@implementation Sub2
@end

@protocol FooProtocol
- (void) foo;
@end
@interface Sub1 (FooCategory) <FooProtocol>
@end
@implementation Sub1 (FooCategory)
- (void) foo {}
@end
@interface Sub2 (FooCategory) <FooProtocol>
@end
@implementation Sub2 (FooCategory)
- (void) foo {}
@end
@interface Super (FooCategory) <FooProtocol>
@end
// Notice that there is no @implementation Super (FooCategory)

这允许我编写一个类似的函数:

void callFoo(NSArray *supers) {
  for (Super *theSuper in supers) {
    [theSuper foo];
  }
}

Sub1Sub2Super仅有的两个子类。我本质上想要类别方法中的多态性。如果我指定@interfacefor Super,但提供 no @implementation,clang 不会给我任何警告/错误。

这是一个非常糟糕的黑客行为吗?

潜在的不利因素是什么?

4

2 回答 2

2

(最初来自对 zneak 答案的评论。)

正如The Objective-C Programming Language中所解释的,一个类别中的方法在运行时真正成为目标类的一部分——这就是为什么破坏现有方法可能很危险,以及为什么实现相同方法的多个类别的行为是不明确的。一旦安装了该方法,它实际上与最初存在的东西没有什么不同:

类别方法可以做任何在类中定义的方法可以做的事情。在运行时,没有区别。类别添加到类的方法被该类的所有子类继承,就像其他方法一样。

可以在其子类上设置一个类别,Super并在其子类上设置一个类别来实现相同的方法,并且如果它们是类本身的一部分,它的工作方式将完全一样。(虽然我确实建议遵循 zneak 的建议,即实现一个存根方法Super以帮助调试,如果它被意外调用。)

于 2012-07-02T18:24:47.213 回答
1

Objective-C 没有“抽象方法”的概念。当您需要一个时,您几乎必须选择使用一些技巧。

尽管我建议您将方法放入Super并在调用时抛出异常。

于 2012-06-22T16:52:28.153 回答