如何使用更具体的类型覆盖超类的属性?

时间:2011-05-05 10:17:54

标签: objective-c properties subclassing override synthesis

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

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

抽象委托协议包含一些必需的方法,并且如“abstract”一词所示,AbstractRequestAbstractRequestDelegate都是子类/扩展。

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

在某个时间点,ConcreteRequest想要调用由ConcreteRequestDelegate定义的委托上的方法。由于委托的类型是id,因此编译器会发出警告,指出可能无法实现此方法。

  

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

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

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

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

问题
有没有办法在具体子类中使用添加的类型信息“重新声明”该属性?或者你能否发现我的想法中的错误,因为这可能是一个相当常见的问题,直到现在我还没有遇到过?

干杯,
EP。

P.S。出现在这项工作中的所有类和协议名称都是虚构的。任何与真实类和协议名称,开源或专利的相似之处纯属巧合。

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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

相关问题