假设我定义了以下协议(protocol):

//用户界面对象的基本协议(protocol):

@protocol UIObjectProtocol <NSObject>
@property (assign) BOOL touchable;
@end

//由holder对象持有的用户界面对象的基本协议(protocol):
@protocol UIHeldObjectProtocol <UIObjectProtocol>
@property (readonly) id holder;
@end

以及以下类层次结构:

//用户界面对象的基类,该对象综合了touchable属性
@interface UIObject : NSObject <UIObjectProtocol> {
   BOOL _touchable;
}
@end

@implementation UIObject
@synthesize touchable=_touchable;
@end

至此,一切正常。然后,我创建一个名为UIObjectUIPlayingCard子类。从本质上讲,UIPlayingCard符合UIObjectProtocol,因为它也是父类(super class)。

现在假设我希望UIPlayingCard符合UIHeldObjectProtocol,因此我执行以下操作:
@interface UIPlayingCard : UIObject <UIHeldObjectProtocol> {
}
@end

@implementation UIPlayingCard
-(id)holder { return Nil; }
@end

请注意,UIPlayingCard符合UIHeldObjectProtocol,后者可传递地符合UIObjectProtocol。但是我在UIPlayingCard中得到了编译器警告,例如:



这意味着没有继承UIPlayingCardUIObjectProtocol父类(super class)一致性(可能是因为@synthesize指令在UIObject实现范围中声明了)。

我有义务在@synthesize实现中重新声明UIPlayingCard指令吗?
@implementation UIPlayingCard
@synthesize touchable=_touchable; // _touchable now must be a protected attribute
-(id)holder { return Nil; }
@end

或者还有另一种摆脱编译器警告的方法?这是设计不良的结果吗?

提前致谢,

最佳答案

我将以另一种方式来使警告静音:使用@dynamic,编译器将假定实现将以不同于类实现中的声明的其他方式提供(在这种情况下,它是由父类(super class)提供的) )。

10-06 13:11