假设我定义了以下协议(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
至此,一切正常。然后,我创建一个名为
UIObject
的UIPlayingCard
子类。从本质上讲,UIPlayingCard
符合UIObjectProtocol
,因为它也是父类(super class)。现在假设我希望
UIPlayingCard
符合UIHeldObjectProtocol
,因此我执行以下操作:@interface UIPlayingCard : UIObject <UIHeldObjectProtocol> {
}
@end
@implementation UIPlayingCard
-(id)holder { return Nil; }
@end
请注意,
UIPlayingCard
符合UIHeldObjectProtocol
,后者可传递地符合UIObjectProtocol
。但是我在UIPlayingCard
中得到了编译器警告,例如:这意味着没有继承
UIPlayingCard
的UIObjectProtocol
父类(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)提供的) )。