通过超类中声明的方法实现协议?

时间:2014-02-27 15:18:32

标签: objective-c protocols

我想知道在某个子类中是否有可能“识别”在它的超类中声明的方法,作为子类协议中声明的方法的实现坚持,因为他们有相同的签名。

甚至难以制定这一点,这就是为什么我所做的任何搜索到目前为止都没有结果。

但是,让我以一个更好理解的例子来说明这个案例。

协议:

@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)而不是子类?

更多背景信息:

这是一个涉及核心数据的场景。我需要在一个协议中发布一个实体类中定义的访问器,该协议将在一个单独的框架中用于为我的应用程序开发插件。协议本身完全由核心数据实体类的类别实现,除了在实体类本身中实现的所述访问器,因此我的问题。

2 个答案:

答案 0 :(得分:1)

从绝对意义上说,这是完全合法的。如果-theProtocolMethod本身没有实现TheSubClass,那么在TheSuperClass的实例上调用TheSubClass确实会调用[super theProtocolMethod]实现。如果需要,您甚至可以在子类实现中调用TheSubClass

如果TheSuperClass-theProtocolMethod上的类别,则仍会调用超类实现。但是,在类别中实现TheSuperClass将取代超类实现,因此您必须小心。

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

答案 1 :(得分:0)

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

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