2

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

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

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

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

}

我相信我是在组合的情况下,因为机器人有一个控制面板。我正在考虑使用事件,但我需要访问许多属性。

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

4

2 回答 2

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类,然后让机器人自己处理结果。例如,假设您更改了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从中提取,但如果您绝对需要它作为机器人的属性,这里有一些解决方案。

于 2012-12-22T19:39:59.493 回答
0

你应该能够通过'this':

cPanel=new ControlPanel(this);

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

扩展显示类时不能使用参数,但 ControlPanel 扩展对象(默认情况下未定义扩展。

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

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

public class ControlPanel{
    ...
    public var robot:Robot;
    public function ControlPanel(){
    }
}
于 2012-12-22T19:47:25.183 回答