在ActionScript3中,我试图从复合中访问调用方对象的属性。
public class Robot {
...
private var controlPanel:ControlPanel;
...
public function Robot() {
...
cPanel = new ControlPanel();
...
}
}我的ControlPanel需要访问机器人实例中的属性,但我认为在调用ControlPanel时无法传递ControlPanel.
public class ControlPanel{
...
public function ControlPanel() {
//How can I refer back to robot properties ?
//
}}
我相信我是在写作的情况下,机器人有一个ControlPanel。我正在考虑使用事件,但我需要访问许多属性。
解决这个问题最好的办法是什么?
发布于 2012-12-22 19:39:59
您总是可以让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-22 19:47:25
你应该能通过“这”:
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(){
}
}https://stackoverflow.com/questions/14005786
复制相似问题