我想知道在某个子类中是否有可能“识别”在它的超类中声明的方法,作为子类协议中声明的方法的实现坚持,因为他们有相同的签名。
甚至难以制定这一点,这就是为什么我所做的任何搜索到目前为止都没有结果。
但是,让我以一个更好理解的例子来说明这个案例。
协议:
@protocol TheProtocol <NSObject>
- (void)theProtocolMethod;
@end
超类:
// Superclass does not adhere to TheProtocol
@interface TheSuperClass : NSObject
- (void)theProtocolMethod;
@end
@implementation TheSuperClass
- (void)theProtocolMethod
{
// stuff
}
@end
子类:
// SubClass adheres to TheProtocol but does not implement it's methods
// since they are implemented in the class it is subclassing. Is this OK?
@interface TheSubClass : TheSuperClass <TheProtocol>
@end
@implementation TheSubClass
@end
这是否接近“OK”?
那个案例TheSubClass
实际上属于TheSuperClass
(声明遵守TheProtocol
)而不是子类?
更多背景信息:
这是一个涉及核心数据的场景。我需要在一个协议中发布一个实体类中定义的访问器,该协议将在一个单独的框架中用于为我的应用程序开发插件。协议本身完全由核心数据实体类的类别实现,除了在实体类本身中实现的所述访问器,因此我的问题。
答案 0 :(得分:1)
从绝对意义上说,这是完全合法的。如果-theProtocolMethod
本身没有实现TheSubClass
,那么在TheSuperClass
的实例上调用TheSubClass
确实会调用[super theProtocolMethod]
实现。如果需要,您甚至可以在子类实现中调用TheSubClass
。
如果TheSuperClass
是-theProtocolMethod
上的类别,则仍会调用超类实现。但是,在类别中实现TheSuperClass
将取代超类实现,因此您必须小心。
主观上,在代码设计方面,它可能有点奇怪。您基本上有两个相同的方法来管理相同的方法,如果您尝试重构,可能会导致问题。我猜你的案例中的超类是一个你无法改变的库类。否则,我不明白为什么{{1}}不应该只符合协议,而不是单独声明方法。
答案 1 :(得分:0)
理论上,你说超类已经符合协议。
如果编译器抱怨,你可以在子类中实现只调用super的包装器方法,并从调用super返回任何返回值。