如何使用更具体的类型覆盖超类的属性?

epo*_*gee 26 overriding synthesis properties objective-c subclassing

方案
我有一种情况,其中一个被调用的基类AbstractRequest具有id <AbstractRequestDelegate>在头文件中声明的类型的委托属性:

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

抽象代表协议包含一些必要方法,并且与字"抽象"所指出的,无论是AbstractRequestAbstractRequestDelegate旨在是子类/扩展.

其中一个例子是子类ConcreteRequest和扩展协议ConcreteRequestDelegates,它们都为抽象方法添加了额外的方法.目的是抽象和具体类方法都可以将消息发送到单个分配的委托实例.

在某个时间点,ConcreteRequest想要调用由ConcreteRequestDelegate定义的委托上的方法.由于委托的类型是id,因此编译器将发出警告,指出可能未实现此方法.

ConcreteRequest.m:38:警告:属性'委托'需要定义方法'-delegate' - 使用@synthesize,@ dynamic或提供方法实现

问题
这个警告是合理的,因为该属性毕竟是打字的id <AbstractRequestDelegate>.为了解决这个问题,我想向编译器说明分配给具体实例的委托必须是类型id <ConcreteRequestDelegate>.这对我来说听起来很合理,所以我在ConcreteRequest标头中添加了一个新属性,希望覆盖它的抽象:

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

但这是编译器不同意我的地方,可能是有充分理由的.我本以为它会用一个错误的类型覆盖一个超级类的属性发出警告,但它只是要求我重新合成这个新属性.我不想去那里,因为那时超类的方法将无法访问相同的委托属性.

问题
有没有办法在具体子类中"重新声明"具有添加的类型信息的属性?或者你能否发现我的想法中的错误,因为这可能是一个相当常见的问题,直到现在我还没有遇到过?

干杯,
EP.

PS这项工作中出现的所有类和协议名称都是虚构的.任何与真实类和协议名称,开源或专利的相似之处纯属巧合.

epo*_*gee 11

警告已经给出了正确的线索.我在重写的子类中使用了@dynamic,一切都很好.

  • 对于后来遇到此问题的人来说,这个答案所说的是,如果您只是重新声明子类中的属性,它会有效地工作但是会有警告.如果然后进入.m文件的实现部分并添加"@dynamic samevariablename"行,它会有效地导致@property声明上的警告/问题消失.可能没有预料到它会这样做,因为警告与问题解决的地方不同,但确实如此.它也适合我. (3认同)