super中无论如何都将被子类化的方法(Cocoa)

super中无论如何都将被子类化的方法(Cocoa),cocoa,subclass,super,Cocoa,Subclass,Super,对不起,如果这是一个转载,但我不能完全搜索它,因为我不能解释它在几句话。我有一个有很多方法的超类,但它们总是(不是全部)被子类化。我需要在超级计算机上运行这些方法。我可以将方法保留为super-empty,也可以不在super中键入它们,而是像这样调用它们[self-myMethod],它将调用我的子类方法,即使它在super中不存在。这是可行的,但是Xcode给了我一个错误“超类”可能不响应“-subclass方法” 我应该怎么做才能不收到警告?我更喜欢在超类中定义未实现的方法,如下所示: @

对不起,如果这是一个转载,但我不能完全搜索它,因为我不能解释它在几句话。我有一个有很多方法的超类,但它们总是(不是全部)被子类化。我需要在超级计算机上运行这些方法。我可以将方法保留为super-empty,也可以不在super中键入它们,而是像这样调用它们
[self-myMethod]
,它将调用我的子类方法,即使它在super中不存在。这是可行的,但是Xcode给了我一个错误<代码>“超类”可能不响应“-subclass方法”


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

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

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

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

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

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

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

    return NO;
}

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

@protocol MyProtocol
-(id)myMethodWith:(id)arg;
@end
更改变量的类型声明,以声明对象符合协议

-(id)doStuffWith:(SuperClass <MyProtocol> *)aThing and:(id)another {
    return [aThing myMethodWith:another]
}
-(id)dostufwith:(超类*)aThing和:(id)other{
return[使用另一种方法]
}

请注意,您将无法将超类的实例传递给
dostufwith:和:
,因为它不会实现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
@protocol-JSDog
-(空)yipe;
@结束
@接口JSDog:NSObject
@结束
@实现JSDog
+(无效)初始化{
if([self-isSubclassOfClass:[JSDog-class]]&&&![self-conformsToProtocol:@protocol(JSDog)]){
NSAssert(false,@“JSDog的子类必须符合”。);
}
}
@结束

使用与类同名的协议在
NSObject
中有先例。由于正式协议a中的方法默认情况下是
@必需的
,您将在两端受到保护:在编译时,如果您的
JSDog
子类声称符合
,但没有实现
-yipe
,您将收到一个错误;在运行时,如果您的子类未声明符合
,则在实例化该子类时,您将收到一条警告。

请不要忘记将标题中的方法记录为抽象的(打算被重写)。这听起来不错,但我的方法是非空的,编译器仍会对返回值唠叨。@Michael然后在调用
-doesNotRecognizeSelector:
后返回一些无意义的值,或者将该方法标记为非返回。通过“将其标记为非返回”,您是指(void)myMethod而不是(NSString*)myMethod?我做了几乎相同的事情,但不是调用DoesNotReconficateSelector:我通常做一些类似NSAssert2的事情(FALSE,@“%@”是抽象的,必须为“%@”、NSStringFromSelector(_cmd)、self重写);好主意。一个
#定义
,这将被证明是有用的。