场景
我有一个情况,在一���名为AbstractRequest
的基类中,有一个在头文件中声明的委托属性,其类型为id <AbstractRequestDelegate>
:
@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
抽象委托协议包含几个必需的方法,而且正如“抽象”一词所示,AbstractRequest
和AbstractRequestDelegate
都是旨在进行子类化/扩展。例如,ConcreteRequest子类和扩展协议ConcreteRequestDelegates,两者都添加了额外的方法以补充抽象方法。其意图是,抽象类和具体类的方法都可以向单个分配的委托实例发送消息。在某个时刻,ConcreteRequest想要调用由ConcreteRequestDelegate定义的委托方法。由于委托的类型是id,编译器会发出警告,说明可能未实现此方法。
ConcreteRequest.m:38: warning: property 'delegate' requires method '-delegate' to be defined - use @synthesize, @dynamic or provide a method implementation 问题 这个警告是合理的,因为该属性的类型是
id <AbstractRequestDelegate>
。为了解决这个问题,我想让编译器明确指出分配给ConcreteRequest实例的委托必须是id <ConcreteRequestDelegate>
类型的。这对我来说听起来非常合理,所以我在ConcreteRequest头文件中添加了一个新的属性,希望覆盖抽象属性。@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;
但是这就是编译器和我不同意的地方,可能有充分的理由。我本以为它会警告我用错误类型重写超类的属性,但实际上它只要求我重新合成这个新属性。我不想这样做,因为超类的方法将无法访问相同的委托属性。
问题
是否有一种方法在具体子类中“重新声明”该属性,并添加类型信息?或者您能否发现我的思维错误,因为这可能是一个常见的问题,直到现在我才没有遇到?
感谢您的帮助,
EP.
注:本作品中出现的所有类和协议名称均为虚构。任何与真实类和协议名称(开源或专利)的相似之处纯属巧合。