场景
我有一个情况称为AbstractRequest
基类具有在头文件中声明id <AbstractRequestDelegate>
类型的代表属性:如何用更具体的类型覆盖超类的属性?
@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
抽象代表协议包含一些必要方法,并且如用“抽象”一词表示,AbstractRequest
和AbstractRequestDelegate
都打算是子类/扩展。
其中一个例子是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.本文中出现的所有类别和协议名称都是虚构的。与真实的类和协议名称,开源或专利的任何相似之处纯属巧合。
lol on P.S. :D ...你可以发布所有界面和类的代码吗......你的解释太长了 – 2011-05-05 10:28:09
这已经花了我半个小时,也许别人可以看穿很多单词。如果全部失败,我会投入时间对这些类进行伪代码。 – epologee 2011-05-05 10:33:02
:D为什么你重新合成会产生问题 – 2011-05-05 10:36:38