子类实现自己的协议委托

时间:2012-10-17 03:01:10

标签: objective-c inheritance objective-c-protocol

我是iOS的新手,不知道这是否可行。

基本上我有两个班级Parent和Child。

Parent有一个符合ParentProtocol的委托。但是,Child中的委托不仅符合ParentProtocol,还符合另一个ChildProtocol。

那么可以做到以下几点吗?

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

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

1 个答案:

答案 0 :(得分:4)

是的,这是有效的代码。这相当于声明方法

- (id<ParentProtocol>)delegate;
- (void)setDelegate:(id<ParentProtocol>)delegate;
Parent界面中的

以及-delegate界面中相同选择器(-setDelegateChild)的声明方法

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

这是允许的(并且不会导致警告),因为id<ParentProtocol>id<ParentProtocol, ChildProtocol>是兼容类型。 (与Child声明delegate声明NSArray *类型为Property type 'NSArray *' is incompatible with type 'id<ParentProtocol>' inherited from 'Parent'的情况相反。您将收到警告ChildProtocol

顺便说一下,值得注意的是,您可以通过编写

来定义ParentProtocol继承@protocol ParentProtocol <NSObject> //.... @end
@protocol ChildProtocol <ParentProtocol>
//....
@end

Child

反过来允许您在@property (nonatomic, unsafe_unretained) id<ChildProtocol>;

的界面中书写
@property (nonatomic, unsafe_unretained) id<ParentProtocol, ChildProtocol>;

而不是

{{1}}