3

抱歉,如果这是转发,但我无法完全搜索它,因为我无法用几句话解释它。我有一个包含很多方法的超类,但它们总是(不是全部)被子类化。从超级我需要运行这些方法。我可以将超级中的方法留空,或者我不能在超级中输入它们但无论如何都可以这样调用它们,[self myMethod]即使它在超级中不存在,它也会调用我的子类方法。这可行,但 Xcode 给了我一个错误。'superclass' may not respond to '-subclassmethod'

我应该怎么做才能不会收到警告?

4

4 回答 4

4

我更喜欢像这样在超类中定义未实现的方法:

@interface GLObject : NSObject {}
- (id)someSubclassProvidedMethod;
@end

@implementation GLObject
- (id)someSubclassProvidedMethod {
  [self doesNotRecognizeSelector: _cmd];
}
@end

-doesNotRecognizeSelector:它几乎完全是多余的,因为如果我根本没有定义方法,Objective-C 运行时最终会调用。但是因为我确实定义了它,所以它位于类的接口中,既让编译器满意,又为我提供了一些文档。

于 2010-04-05T09:41:27.423 回答
1

除了超类,您可以在协议中声明方法,在其他语言中称为“接口”。

@protocol MyProtocol
-(id)myMethodWith:(id)arg;
@end

更改变量的类型声明以声明对象符合协议。

-(id)doStuffWith:(SuperClass <MyProtocol> *)aThing and:(id)another {
    return [aThing myMethodWith:another]
}

请注意,您将无法将 SuperClass 的实例传递给doStuffWith:and:,因为它不会实现 MyProtocol,但听起来这就是您想要的。

于 2010-04-05T11:44:49.890 回答
1

我的解决方案有点奇怪,但这里是:

@protocol JSDog <NSObject>
- (void)yipe;
@end

@interface JSDog : NSObject
@end

@implementation JSDog

+ (void)initialize {
  if ([self isSubclassOfClass:[JSDog class]] && ![self conformsToProtocol:@protocol(JSDog)]) {
    NSAssert(false, @"Subclasses of JSDog must conform to <JSDog>.");
  }
}

@end

具有与类同名的协议在NSObject. 因为默认情况下正式协议中的方法 a @required,您将在两端受到保护:在compile-time,如果您的JSDog子类声称符合<JSDog>,但未实现-yipe,您将收到错误;在运行时,如果您的子类不声称符合<JSDog>,您将在子类实例化时收到警告。

于 2010-04-05T13:11:22.807 回答
0

我最近喜欢使用 NSAssert 来完成这项任务:

- (BOOL)proceedForVersion:(int)versionInteger
{
    NSAssert(false, @"This method needs to be overridden in a subclass of iMBApertureAbstractParser");

    return NO;
}
于 2010-04-05T11:10:31.410 回答