2017-03-02 58 views
7

我有这样的事情:使用__attribute __((objc_requires_super))与协议

@protocol MyProtocol <NSObject> 

- (void)oneMethod; 

@end 

@interface BaseClassWithProtocol : NSObject <MyProtocol> 

@end 

@interface ChildClassWithProtocol : BaseClassWithProtocol 

@end 

BaseClassWithProtocol已实施oneMethod,我想显示警告,如果ChildClassWithProtocol不在其oneMethod实现中调用超。

但我不知道我应该在哪里写__attribute__((objc_requires_super))

将它写入协议不支持,而在.h中重新定义oneMethod看起来很愚蠢。

那么有没有什么标准的方法可以处理这个问题?

回答

7

调用super的要求是BaseClassWithProtocol。这不是协议的一部分。当然,有些课程可能会实施MyProtocol,但是如果没有强制要求,则可以实施。这是协议的本质。他们强加接口,而不是实现。

因此,用属性重新声明BaseClassWithProtocol中的方法对我来说似乎是非常明智的。不知道为什么它“看起来很愚蠢”。

+0

谢谢。 在.h中重新声明oneMethod不会覆盖接口,它恰好与协议中声明的声明相同。我不知道我的理解是否正确。但是,如果在.h和协议中声明的这两个方法具有相同的名称但参数类型不同呢?这就是为什么我认为它很愚蠢,因为我不知道哪一个是最终的声明,而且两次声明似乎很冗长。但是,它似乎是我可以放入铛属性的唯一地方,我将采取这一做法。 – Tepmnthar

+0

但是,你能告诉我swift协议扩展是否可以做到这一点(我对swift知之甚少)。或者你能告诉我如何用一个具有协议和抽象类的类(不是其他语言中的“抽象类”,仅仅意味着比其子的抽象更抽象,也许不实现某些方法),使用宏/铿锵属性/还是其他? – Tepmnthar

+0

@Tepmnthar同名,但参数类型不同?这两种方法将被视为两种不同的方法,因为Objective-C没有*方法重载* – nayem

1

协议并不意味着为您的各种实现提供警告。他们只会警告你是否同意在你的实施中包含所需的方法。但是,如何实现这些方法,这取决于采用该协议的类。也就是,你应该在你的.h或者.m文件中有你需要的功能。

考虑是这样的:

您的协议,其中你想拥有的超级电话报警的方法。现在你在NSObject的子类中使用协议。但NSObject类不符合您定义的协议。你现在应该为你的班级收到警告吗? 根据你的要求,你应该得到这个警告。但事实并非如此。你几乎从来不会通过这个程序得到这个警告。

+0

谢谢。我明白。只是没有看到在\ @protocol和\ @interface中声明了两次并感觉有点好奇的方法。 – Tepmnthar