2014-02-27 27 views
0

我想知道在某个子类中是否有可能“识别”在其超类中声明的方法作为在协议中声明的方法的实现子类所遵循的,因为它们具有相同的签名。通过在超类中声明的方法实现协议?

它甚至很难制定这个,这就是为什么我所做的任何搜索结果迄今为止没有结果。

但让我来举一个例子来更好地理解。

协议:

@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

你试过看它是否有效吗?如果它不起作用,它应该抱怨你没有从协议中实现一个方法,但是如果它有效,那么应该没有警告。 – Gavin

+0

我最终尝试了类别选择。确实没有警告出现。从基类中除去方法声明点亮了关于未实现方法的警告。所以我想它在他结束的时候会有诀窍。 – insys

回答

1

绝对而言,这是完全合法的。在TheSubClass的实例上调用-theProtocolMethod确实会调用TheSuperClass实现,如果TheSubClass本身没有实现它。如果您愿意,您甚至可以在子类实现中调用[super theProtocolMethod]

如果TheSubClassTheSuperClass的一个类别,超类的实现仍然会被调用。但是,在类别中实现-theProtocolMethod将取代超类实现,因此您必须在此谨慎。

主观上,在代码设计方面,它可能有点奇怪。你基本上有两个单独的声明来管理相同的方法,如果你尝试重构,这可能会导致问题。我猜你的案例中的超类是一个你不能改变的库类。否则,我不明白为什么TheSuperClass不应该只符合协议,而不是单独声明该方法。

+0

感谢您的回答。在这个问题中,我不考虑在子类或类别中实现该方法,所以我想替换和维护多个实现不会是一个问题。我编辑了我的问题,以提供更多的上下文(这是关于核心数据)。 – insys

+0

超级类接口中重复声明的优点是您可以使用NS_REQUIRES_SUPER对其进行标记,而无法在协议中进行标记。但是,您也可以添加一个TheSuperClassSubclass.h头文件,该头文件具有类别@interface TheSuperClass(受保护),然后将其包含在子类.m文件中,并在TheSuperClass.m文件中添加类扩展TheSuperClass()以帮助您确保你有所有的方法。 – malhal

0

理论上你说的超类已经符合协议。

如果编译器抱怨,你可以在你的子类中实现包装方法,它只需调用super并将任何返回值从调用返回给super。