【问题标题】:AS3 - OOP - inheritanceAS3 - OOP - 继承
【发布时间】:2011-11-24 12:51:14
【问题描述】:

我有以下继承结构:

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

我正在尝试通过 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

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

【问题讨论】:

  • 你在哪里试图访问 Player 类中的父级?构造函数?
  • 您尝试做的是非常糟糕的做法。您能否提供更多有关最终目标的信息,以便我们为您指明正确的方向?

标签: actionscript-3 oop


【解决方案1】:

也许您应该尝试不同的方法。从您的播放器类中调度自定义事件。 让您的环境收听事件。在侦听器中设置该事件的属性。 当事件冒泡回到玩家类时,他可以从事件中获取值。这样你的播放器类就可以在没有 AvEnvironment 的情况下运行,所以它有点 OOP。

播放器类中的代码如下所示:

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

    dispatchEvent(playerEvent);

    return playerEvent.xs;
}

你的 Environment 类应该有一个像这样的监听器:

player.addEventListener(PlayerEvent.REQUEST_XS, onRequestXs);

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

【讨论】:

  • 虽然基于事件的方法肯定更好,但孩子不应该知道或不需要知道父级的属性。如果这是孩子实际需要的值,则应将其作为属性公开,然后应从外部设置该属性(原始帖子中的父级或工厂代码)。
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 2016-06-25
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2015-10-12
  • 1970-01-01
相关资源
最近更新 更多