在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。我正在考虑使用事件,但我需要访问许多属性。
解决这个问题的最佳方法是什么?
答案 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(){
}
}