超级中的方法无论如何都会被子类化(Cocoa)

时间:2010-04-05 09:01:56

标签: cocoa subclass super

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

我该怎么办,所以我不会收到警告?

4 个答案:

答案 0 :(得分:4)

我更喜欢在超类中定义未实现的方法,如下所示:

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

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

这几乎完全是多余的,因为如果我根本没有定义方法,Objective-C运行时最终会调用-doesNotRecognizeSelector:。但是因为我确实定义了它,所以它在类的界面中既能保持编译器的快乐,也能为我提供一些文档。

答案 1 :(得分:1)

您可以在protocol中声明方法,而不是超类,在其他语言中称为“接口”。

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

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

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

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

答案 2 :(得分: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之前。由于正式协议中的方法默认为@required,因此您将受到两端的保护:在编译时中,如果您的JSDog子类声称符合{{1但是,如果没有实现<JSDog>,您将收到错误;在运行时,如果您的子类声称不符合-yipe,则在实例化子类时将收到警告。

答案 3 :(得分:0)

我最近喜欢使用NSAssert执行此任务:

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

    return NO;
}