2

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

4

3 回答 3

4

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

您可以遵守协议,而无需在头文件中声明您的一致性。例如,如果您将其放在文件中的声明NSCoding上方,您可以遵守“秘密” :@implementation.m

@interface MyObject () <NSCoding>
@end

这声明了一个将协议添加到类的类扩展NSCodingMyObject

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

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

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

并且任何人都可以通过先转换对象来向 a发送NSCoding消息:MyObject

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

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

于 2012-08-08T07:21:18.007 回答
0

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

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

可能有一些 hack 允许直接调用您想要的方法,但这并不容易,甚至可能是不可能的。

于 2012-08-08T07:16:12.440 回答
0

协议或其他方式,没有办法阻止方法被子类覆盖

[来源]

于 2012-08-08T07:20:36.080 回答