我正在尝试将SneakyInput添加到我当前的 Cocos2D-x项目中。我必须调整一些东西才能让它工作(因为 github 源代码已经过时了)。长话短说,一切正常,除了我从以下代码中收到两个警告(用注释表示):
错误:
属性“颜色”的属性“只读”限制从“CCRGBAProtocol”继承的属性的“读写”属性
#import "cocos2d.h"
@interface ColoredCircleSprite : CCNode <CCRGBAProtocol, CCBlendProtocol> {
float radius_;
GLubyte opacity_;
ccColor3B color_;
NSUInteger numberOfSegments;
GLfloat *circleVertices_;
ccBlendFunc blendFunc_;
}
@property (nonatomic,readwrite) float radius;
/** Opacity: conforms to CCRGBAProtocol protocol */
@property (nonatomic,readonly) GLubyte opacity; //<--------- ERROR thrown here!!
/** Opacity: conforms to CCRGBAProtocol protocol */
@property (nonatomic,readonly) ccColor3B color; //<--------- ERROR thrown here!!
/** BlendFunction. Conforms to CCBlendProtocol protocol */
@property (nonatomic,readwrite) ccBlendFunc blendFunc;
/** creates a Circle with color and radius */
+ (id) circleWithColor: (ccColor4B)color radius:(GLfloat)r;
/** initializes a Circle with color and radius */
- (id) initWithColor:(ccColor4B)color radius:(GLfloat)r;
- (BOOL) containsPoint:(CGPoint)point;
@end
我能找到的关于这个错误的唯一信息来自这里。接受的答案指出:
它说您可以将 readonly 属性重新声明为 readwrite 但您正在做相反的事情。您不能/不应该这样做,因为可以这样做:
Sub* s = [[[Sub alloc] init] autorelease];
Base* b = s;
b.foo = YES; //legal for `Base` objects, but not legal for `Sub` objects
这违反了Liskov 替代原则。
我的问题是我并不完全理解维基百科的文章。我知道这个问题源于继承。整个 A is-a B 来自OOP。等等我只是想知道解决和解决这个问题的适当方法是什么?我是喜欢有 0 个警告/错误的人之一。有没有一种简单的方法来补救这个警告,抑制它等等?我也很感谢您对“为什么”您的方法有效的一些解释(因为包括我自己在内的每个人都可以从中学习)。