在AS3中使用合成时访问调用者对象

时间:2012-12-22 19:19:10

标签: actionscript-3 composition

在ActionScript3中,我试图从复合中访问调用者对象的属性。

public class Robot {
 ...
 private var controlPanel:ControlPanel;
 ...
 public function Robot() {
 ...
 cPanel = new ControlPanel();
 ...
  }
 }

我的ControlPanel需要从Robot实例访问属性,但我认为在调用ControlPanel时我不能通过this ...

public class ControlPanel{
...
 public function ControlPanel() {
  //How can I refer back to robot properties ?
  //
 }

}

我相信我是组合的情况,因为Robot 有一个 ControlPanel。我正在考虑使用事件,但我需要访问许多属性。

解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您始终可以让ControlPanel存储对其自己的Robot对象的引用,如下所示:

// ControlPanel
private var robot:Robot;

public function ControlPanel(robot:Robot) {
    this.robot = robot;
}

然后,在创建控制面板时:

// Robot
public function Robot() {
    controlPanel = new ControlPanel(this);
}

或者,您可以创建一个偶数系统,然后让控制面板调度它们。您可以创建自己的ControlPanelEvent类,然后让Robot自己处理结果。例如,假设您在控制面板中更改了名为foo的属性。您可以这样发送:

var event:ControlPanelEvent = new ControlPanelEvent(ControlPanelEvent.PROPERTY_CHANGE, "foo", value);

然后你会收到它:

public function Robot() {
    controlPanel = new ControlPanel();
    controlPanel.addEventListener(ControlPanelEvent.PROPERTY_CHANGE, updateProperty);
}

public function updateProperty(event:ControlPanelEvent):void {
    if (event.key == "foo") {
        this.foo = event.value;
    }
}

然而,这是罗嗦和不必要的。您还可以在事件处理程序中使用ActionScript的数组访问表示法,这将是一个简单的单行程序:

this[event.key] = event.value;

但是,这并不完全安全,因为您可能不希望控制面板能够更新所有机器人的属性。相反,您可以维护机器人可以拥有的简单可配置属性映射,并更新它:

private var configuration:Dictionary = new Dictionary();

public function Robot() {
    // ...
    configuration.foo = "bar";
    configuration.baz = "qux";
    //...
}

public function updateProperty(event:ControlPanelEvent):void {
    if (configuration.hasOwnProperty(event.key))
        configuration[event.key] = event.value;
}

你去吧。当然,你可以总是只将配置图存储在ControlPanel本身,让Robot从中拉出来,但如果你绝对需要它作为机器人,这里有一些解决方案。

答案 1 :(得分:0)

你应该能够传递'this':

cPanel=new ControlPanel(this);

public class ControlPanel{
    ...
    protected var _robot:Robot;
    public function ControlPanel(robot:Robot){
        _robot = robot;
    }
}

扩展显示类时不能使用参数,但ControlPanel扩展了Object(默认情况下没有定义扩展。

对于显示类,您可以在创建后设置属性:

cPanel=new ControlPanel();
cPanel.robot = this;

public class ControlPanel{
    ...
    public var robot:Robot;
    public function ControlPanel(){
    }
}