抱歉,如果这是转发,但我无法完全搜索它,因为我无法用几句话解释它。我有一个包含很多方法的超类,但它们总是(不是全部)被子类化。从超级我需要运行这些方法。我可以将超级中的方法留空,或者我不能在超级中输入它们但无论如何都可以这样调用它们,[self myMethod]
即使它在超级中不存在,它也会调用我的子类方法。这可行,但 Xcode 给了我一个错误。'superclass' may not respond to '-subclassmethod'
我应该怎么做才能不会收到警告?
我更喜欢像这样在超类中定义未实现的方法:
@interface GLObject : NSObject {}
- (id)someSubclassProvidedMethod;
@end
@implementation GLObject
- (id)someSubclassProvidedMethod {
[self doesNotRecognizeSelector: _cmd];
}
@end
-doesNotRecognizeSelector:
它几乎完全是多余的,因为如果我根本没有定义方法,Objective-C 运行时最终会调用。但是因为我确实定义了它,所以它位于类的接口中,既让编译器满意,又为我提供了一些文档。
除了超类,您可以在协议中声明方法,在其他语言中称为“接口”。
@protocol MyProtocol
-(id)myMethodWith:(id)arg;
@end
更改变量的类型声明以声明对象符合协议。
-(id)doStuffWith:(SuperClass <MyProtocol> *)aThing and:(id)another {
return [aThing myMethodWith:another]
}
请注意,您将无法将 SuperClass 的实例传递给doStuffWith:and:
,因为它不会实现 MyProtocol,但听起来这就是您想要的。
我的解决方案有点奇怪,但这里是:
@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>
,您将在子类实例化时收到警告。
我最近喜欢使用 NSAssert 来完成这项任务:
- (BOOL)proceedForVersion:(int)versionInteger
{
NSAssert(false, @"This method needs to be overridden in a subclass of iMBApertureAbstractParser");
return NO;
}