objective-c - 如何使用更具体的类型覆盖父类(super class)的属性?

原文 标签 objective-c properties subclassing overriding synthesis

场景
我有一个名为 AbstractRequest 的基类的情况。具有类型 id <AbstractRequestDelegate> 的委托(delegate)属性在头文件中声明:

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

抽象委托(delegate)协议(protocol)包含一些必需的方法,如“抽象”一词所示,AbstractRequestAbstractRequestDelegate旨在成为子类/扩展。

这方面的一个例子是子类 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/

相关文章:

ios - 以编程方式设置自动锁定

iphone - 如何以编程方式从 plist 添加和检索数据

javascript - 如何将对象属性作为参数传递? (JavaScript)

javascript - 对象属性分配中的语法错误

Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题?

iphone - 将subLayer添加到imageView.layer

Json.NET (Newtonsoft.Json) - 两个同名的 'properties'?

python - 将list.insert()方法模拟为Python列表的子类

swift - 返回 Self 的协议(protocol)函数

objective-c - 静态NSInteger使用未使用的变量警告,但NSString不使用