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