场景
我有这样一种情况,其中调用的基类具有在头文件中声明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 本作品中出现的所有类和协议名称都是虚构的。任何与真实类和协议名称的相似之处,无论是开源的还是专利的,纯属巧合。