我正在尝试覆盖父类方法。我成功地做到了。但是当我试图访问一个属性时。我收到以下错误
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
}
}
答案 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意味着该类及其子类。