场景
我有一个名为 AbstractRequest
的基类的情况具有类型为 id <AbstractRequestDelegate>
的委托(delegate)属性在头文件中声明:
@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
抽象委托(delegate)协议(protocol)包含一些必需的方法,如“抽象”一词所示,AbstractRequest
和 AbstractRequestDelegate
旨在成为子类/扩展。
其中一个例子是子类 ConcreteRequest 和扩展协议(protocol) ConcreteRequestDelegates,它们都向抽象方法添加了额外的方法。目的是抽象类方法和具体类方法都可以将消息发送到单个分配的委托(delegate)实例。
在某个时间点,ConcreteRequest 想要调用由 ConcreteRequestDelegate 定义的委托(delegate)的方法。因为委托(delegate)的类型是 id ,所以编译器会给出这个方法可能没有实现的警告。
ConcreteRequest.m:38: warning: property 'delegate' requires method '-delegate' to be defined - use @synthesize, @dynamic or provide a method implementation
问题
此警告是合理的,因为该属性毕竟已键入 id <AbstractRequestDelegate>
.为了解决这个问题,我想向编译器说明分配给具体实例的委托(delegate)必须是 id <ConcreteRequestDelegate>
类型。 .这对我来说听起来非常合理,所以我在 ConcreteRequest header 中添加了一个新属性,希望覆盖抽象属性:
@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;
但这就是编译器不同意我的地方,可能有充分的理由。我原以为它会警告用错误的类型覆盖父类(super class)的属性,但它只是要求我重新合成这个新属性。我不想去那里,因为那样父类(super class)的方法将无法访问相同的委托(delegate)属性。
问题
有没有办法使用添加的类型信息“重新声明”具体子类中的属性?或者您能找出我的想法中的错误吗,因为也许这是一个相当普遍的问题,我只是直到现在才遇到过?
干杯,
EP.
附言本作品中出现的所有类名和协议(protocol)名均为虚构。与真正的类和协议(protocol)名称、开源或专利名称的任何相似之处纯属巧合。
最佳答案
警告已经给出了正确的线索。我在覆盖子类中使用了@dynamic,一切都很好。
关于objective-c - 如何用更具体的类型覆盖父类(super class)的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5896085/