首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AS3中使用组合时访问调用方对象

在AS3中使用组合时访问调用方对象
EN

Stack Overflow用户
提问于 2012-12-22 19:19:09
回答 2查看 334关注 0票数 2

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

代码语言:javascript
复制
public class Robot {
 ...
 private var controlPanel:ControlPanel;
 ...
 public function Robot() {
 ...
 cPanel = new ControlPanel();
 ...
  }
 }

我的ControlPanel需要访问机器人实例中的属性,但我认为在调用ControlPanel时无法传递ControlPanel.

代码语言:javascript
复制
public class ControlPanel{
...
 public function ControlPanel() {
  //How can I refer back to robot properties ?
  //
 }

}

我相信我是在写作的情况下,机器人有一个ControlPanel。我正在考虑使用事件,但我需要访问许多属性。

解决这个问题最好的办法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-22 19:39:59

您总是可以让ControlPanel存储对它自己的Robot对象的引用,如下所示:

代码语言:javascript
复制
// ControlPanel
private var robot:Robot;

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

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

代码语言:javascript
复制
// Robot
public function Robot() {
    controlPanel = new ControlPanel(this);
}

或者,您可以创建一个均匀的排序系统,然后让控制面板分派它们。您可以创建自己的ControlPanelEvent类,然后让机器人自己处理结果。例如,假设您在控制面板中更改了一个名为foo的属性。你可以这样分派它:

代码语言:javascript
复制
var event:ControlPanelEvent = new ControlPanelEvent(ControlPanelEvent.PROPERTY_CHANGE, "foo", value);

然后你就会收到这样的礼物:

代码语言:javascript
复制
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的数组访问符号,这将是一个简单的一行:

代码语言:javascript
复制
this[event.key] = event.value;

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-12-22 19:47:25

你应该能通过“这”:

代码语言:javascript
复制
cPanel=new ControlPanel(this);

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

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

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

代码语言:javascript
复制
cPanel=new ControlPanel();
cPanel.robot = this;

public class ControlPanel{
    ...
    public var robot:Robot;
    public function ControlPanel(){
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14005786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档