0

我正在尝试将SneakyInput添加到我当前的 Cocos2D-x项目中。我必须调整一些东西才能让它工作(因为 github 源代码已经过时了)。长话短说,一切正常,除了我从以下代码中收到两个警告(用注释表示):

错误:

属性“颜色”的属性“只读”限制从“CCRGBAProtocol”继承的属性的“读写”属性

ColoredCircleSprite.h

#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 个警告/错误的人之一。有没有一种简单的方法来补救这个警告,抑制它等等?我也很感谢您对“为什么”您的方法有效的一些解释(因为包括我自己在内的每个人都可以从中学习)。

4

0 回答 0