2

CallManager3で、コンポジットから呼び出し元オブジェクトのプロパティにアクセスしようとしています。

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 ?
  //
 }

}

ロボットにはControlPanelがあるので、私は作曲の場合だと思います。イベントの利用を考えていますが、アクセスする必要のある物件がたくさんあります。

これを解決するための最良の方法は何でしょうか?

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;
}

どうぞ。もちろん、いつでも構成マップをそれ自体に格納し、そこからプルさせることもできますが、ロボットのプロパティとして絶対に必要な場合は、いくつかの解決策があります。ControlPanelRobot

于 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 に答える