Objective c是否支持协议的私有继承

时间:2012-08-08 07:09:09

标签: objective-c objective-c-category

协议是否可以私有继承,以便在下一个继承级别中不应该访问它?

3 个答案:

答案 0 :(得分:4)

Objective-C没有C ++那样的“私有继承”(或“私有一致性”)。

您可以符合协议,而不会在头文件中宣传您的一致性。例如,如果您将NSCoding语句置于@implementation文件中,则可以.m“秘密”:

@interface MyObject () <NSCoding>
@end

声明了一个类扩展,它将NSCoding协议添加到MyObject类。

但是,任何人(包括子类)都可以询问您是否采用该协议:

[[MyObject class] conformsToProtocol:@protocol(NSCoding)]
// returns YES

[[MySubObject class] conformsToProtocol:@protocol(NSCoding)]
// also returns YES, if MySubObject is a subclass of MyObject

并且任何人都可以通过首先投射对象向NSCoding发送MyObject消息:

[(id<NSCoding>)someObject encodeWithCoder:someCoder]

如果你创建了MyObject的子类,并且你的子类也声明它符合NSCoding,那么它几乎肯定需要从它自己的{{1}调用[super encodeWithCoder:]方法。

答案 1 :(得分:0)

不,由于语言设计,这是不可能的。

此外,由于任何方法都可以覆盖,因此如果来自正确的类,您无法确定您的被调用方法。

可能有一些黑客允许直接调用你想要的方法,但这并不容易,甚至可能无法实现。

答案 2 :(得分:0)

协议或其他方式,无法阻止子类重写的方法

[Source]