Search code examples
objective-cinheritanceobjective-c-protocol

Subclass implements its own protocol delegate


I am new to iOS, don't know if this is possible or not.

Basically I have two classes Parent and Child.

Parent has a delegate which conforms to ParentProtocol. However, the delegate in Child not only conforms to ParentProtocol, but also another ChildProtocol.

So is it possible to do the following?

@interface Parent {
  @property (nonatomic, unsafe_unretained) id<ParentProtocol> delegate;
}

@interface Child : Parent {
  @property (nonatomic, unsafe_unretained) id<ParentProtocol, ChildProtocol> delegate;
}

Solution

  • Yes, this is valid code. This amounts to declaring the methods

    - (id<ParentProtocol>)delegate;
    - (void)setDelegate:(id<ParentProtocol>)delegate;
    

    in the Parent interface and declaring methods for the same selectors (-delegate and -setDelegate) in the Child interface

    - (id<ParentProtocol, ChildProtocol>)delegate;
    - (void)setDelegate:(id<ParentProtocol, ChildProtocol>)delegate;
    

    This is permissible (and causes no warnings) because id<ParentProtocol> and id<ParentProtocol, ChildProtocol> are compatible types. (Contrast this to the situation where in Child's declaration you declare delegate to be of type NSArray *. You'll get the warning Property type 'NSArray *' is incompatible with type 'id<ParentProtocol>' inherited from 'Parent'.)

    By the way, it is worth noting that you can define ChildProtocol to inherit from ParentProtocol by writing

    @protocol ParentProtocol <NSObject>
    //....
    @end
    

    and

    @protocol ChildProtocol <ParentProtocol>
    //....
    @end
    

    Which in turn would allow you to write in the interface of Child

    @property (nonatomic, unsafe_unretained) id<ChildProtocol>;
    

    rather than

    @property (nonatomic, unsafe_unretained) id<ParentProtocol, ChildProtocol>;