26

场景
我有这样一种情况,其中调用的基类具有在头文件中声明AbstractRequest的类型的委托属性:id <AbstractRequestDelegate>

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;

抽象委托协议包含一些必需的方法,并且如“抽象”一词所示,theAbstractRequest和 theAbstractRequestDelegate都旨在成为子类/扩展。

这方面的一个例子是子类 ConcreteRequest 和扩展协议 ConcreteRequestDelegates,它们都向抽象方法添加了额外的方法。目的是抽象和具体类方法都可以将消息发送到单个分配的委托实例。

在某个时间点,ConcreteRequest 想要调用由 ConcreteRequestDelegate 定义的委托的方法。因为委托的类型是 id ,编译器会给出一个警告,这个方法可能没有被实现。

ConcreteRequest.m:38:警告:属性 'delegate' 需要定义方法 '-delegate' - 使用 @synthesize、@dynamic 或提供方法实现

问题
这个警告是有道理的,因为该属性毕竟是键入的id <AbstractRequestDelegate>。为了解决这个问题,我想向编译器说明分配给具体实例的委托必须是 type id <ConcreteRequestDelegate>。这对我来说听起来很合理,所以我在 ConcreteRequest 标头中添加了一个新属性,希望覆盖抽象的:

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;

但这是编译器不同意我的地方,可能有充分的理由。我原以为它会警告用错误的类型覆盖超类的属性,但它只是要求我重新合成这个新属性。我不想去那里,因为这样超类的方法将无法访问相同的委托属性。

问题
有没有办法用添加的类型信息“重新声明”具体子类中的属性?或者你能发现我的想法中的错误吗,因为也许这是一个我直到现在才遇到的相当普遍的问题?

干杯,
EP。

PS 本作品中出现的所有类和协议名称都是虚构的。任何与真实类和协议名称的相似之处,无论是开源的还是专利的,纯属巧合。

4

2 回答 2

11

警告已经给出了正确的线索。我在覆盖的子类中使用了@dynamic,一切都很好。

于 2011-05-07T11:20:11.513 回答
2

只需合成它就可以正常id<ConcreteRequestDelegate>delegate工作 ConcreteRequest.m......它不会产生任何问题。

于 2011-05-05T10:35:06.247 回答