1178:尝试访问通过静态类型的引用留下的不可访问的属性

时间:2010-01-06 23:30:40

标签: flash actionscript-3 actionscript flash-cs4

我正在尝试覆盖父类方法。我成功地做到了。但是当我试图访问一个属性时。我收到以下错误

1178: Attempted access of inaccessible property left through a reference with static type

此属性是公共的,已定义。下面是我的代码

package com.objects {

import flash.display.MovieClip;
import flash.events.*;
import flash.display.Stage;
import flash.geom.Rectangle;


public class Brick extends MovieClip {

public var points:Number = 100;
public var bWidth:Number = 50;
public var bHeight:Number = 20;
private var left:Number;
private var right:Number;
private var top:Number;
private var bottom:Number;
public var ball:Ball;
private var lastDistance:Number;
private var engine:Engine;

public var hit:Boolean;


public function Brick():void
{
stop();
addEventListener(Event.ENTER_FRAME, loop);
}

protected function loop(e:Event):void
{
updateArea();
checkBall();
}
protected function updateArea():void {
left = x;
right = x + bWidth;
top = y;
bottom = y + bHeight;
}

protected function killSelf():void {
engine.score += points;
engine.numberOfBricks -= 1;
removeEventListener(Event.ENTER_FRAME,loop);
engine.removeChild(this);
}

protected function checkBall():void
{
if(hitTestObject(ball))
{

if((ball.x + 5) < left)
{
ball.xspeed *= -1;
ball.x -= ball.xspeed + 10;
killSelf();
}
else if((ball.x - 5) > right)
{
ball.xspeed *= -1;
ball.x += ball.xspeed+10;
killSelf();
}

else if(ball.y > bottom && ball.x > left && ball.x < right)
{
ball.yspeed *= -1;
ball.y += ball.yspeed+10;
killSelf();

}
else if(ball.y < top && ball.x > left && ball.x < right)
{
ball.yspeed *= -1;
ball.y -= ball.yspeed+10;
killSelf();                 
}

}
}//End CheckBall

public function getEngine(engine:Engine):void
{
this.engine = engine;
}
public function getBall(ball:Ball):void
{
this.ball = ball;
}
}
} 

这是重写的课程

package com.objects {

    import flash.display.MovieClip;
    import flash.events.*;
    import flash.display.Stage;
    import flash.geom.Rectangle;


    public class Brick2 extends Brick {

        private var armor:Number = 2;

        public function Brick2():void
        {
            gotoAndStop(2);
        }

        override protected function checkBall():void
        {
            if(hitTestObject(this.ball))
            {
                if(armor <=0){

                    if((this.ball.x + 5) < left)
                    {
                        this.ball.xspeed *= -1;
                        this.ball.x -= this.ball.xspeed + 10;
                        killSelf();
                    }
                    else if((this.ball.x - 5) > right)
                    {
                        this.ball.xspeed *= -1;
                        this.ball.x += this.ball.xspeed+10;
                        killSelf();
                    }

                    else if(this.ball.y > bottom && this.ball.x > left && this.ball.x < right)
                    {
                        this.ball.yspeed *= -1;
                        this.ball.y += this.ball.yspeed+10;
                        killSelf();

                    }
                    else if(this.ball.y < top && this.ball.x > left && this.ball.x < right)
                    {
                        this.ball.yspeed *= -1;
                        this.ball.y -= this.ball.yspeed+10;
                        killSelf();                 
                    }
                }//end armor condition
                else
                {
                    --armor
                }
            }
        }//End Checkthis.ball

    }
}

3 个答案:

答案 0 :(得分:4)

在您的基类中,var left被声明为私有。试图从其他地方访问它,包括后代类将失败。

答案 1 :(得分:2)

我为这个案例找到了一个简单的解决方法。 阅读该属性时,请使用普通的actionscript getter。 但是,而不是优雅的actionscript setter只是指定类似java的setter。

public function get property():Number { return _property; }
myCustomNamespace function setProperty(value:Number):void { _property = value; }

答案 2 :(得分:1)

如果要在子类中使用变量,则必须受保护,而不是私有

私有意味着只有那个类才能看到它,protected意味着该类及其子类。