Search code examples
objective-cobjective-c-category

Does objective c support private inheritance of protocol


Can a protocol can be inherited privately so that in next inheritance level this should not be accessed ?


Solution

  • Objective-C has no “private inheritance” (or “private conformance”) the way C++ does.

    You can conform to a protocol without advertising your conformance in your header file. For example, you can conform to NSCoding “secretly” if you put this above your @implementation statement in your .m file:

    @interface MyObject () <NSCoding>
    @end
    

    That declares a class extension that adds the NSCoding protocol to the MyObject class.

    However, anyone (including a subclass) can ask whether you adopt the protocol:

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

    and anyone can send an NSCoding message to a MyObject by casting the object first:

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

    And if you make a subclass of MyObject, and your subclass also declares that it conforms to NSCoding, then it almost certainly needs to call [super encodeWithCoder:] from its own encodeWithCoder: method.