2011-11-24 87 views
0

我有以下的继承结构:AS3 - 面向对象 - 继承

var environment:AvEnvironment = new AvEnvironment(...); 
addChild(environment);  
environment.addChild(new Terrain()); 
environment.addChild(new Player()); 

我想通过播放器类访问从AvEniroments类的公共属性,但我得到一个未定义的属性错误(#119 )。我已经试过如下:

this.x = AvEnvironment.xs // public property in this class 
this.x = parent.xs 

我也试过这样的事情:

var ev:AvEnvironment = AvEnvironment(parent); 
this.x = ev.xs 

但我得到一个类型错误。错误#1009:无法访问空对象引用的属性或方法。

+0

下落您试图访问父的球员类?构造函数? – Hawks

+0

你试图做的是非常糟糕的做法。您能否提供更多关于最终目标的信息,以便我们可以指引您朝着正确的方向发展? –

回答

0

也许你应该试试不同的approuch。从您的播放器类派遣自定义事件。 让您的环境倾听事件。在侦听器中设置该事件的属性。 当事件回到玩家阶层时,他可以从事件中获得价值。这样你的播放器类就可以在没有AvEnvironment的情况下工作,所以它有更多的OOP。

您的播放器类中的代码将是这样的:

function fetchEvXs() : Number 
{ 
    var playerEvent:PlayerEvent = new PlayerEvent(PlayerEvent.REQUEST_XS); 

    dispatchEvent(playerEvent); 

    return playerEvent.xs; 
} 

环境类应该有一个这样的监听器:

player.addEventListener(PlayerEvent.REQUEST_XS, onRequestXs); 

function onRequestXs(e:PlayerEvent) : void 
{ 
    e.xs = 100; 
} 
+0

虽然基于事件的方法绝对更好,但孩子不应该知道或需要了解父母的属性。如果这是孩子实际需要的价值,则应将其作为自己的财产公开,然后应从外部(父母或原始职位中的工厂代码)设置财产。 –