私が知る限り、実行時に実際にswfをロードしていて、それらの間のイベントをリッスンしようとしているのでない限り、トピックはあまり当てはまりません。また、階層自体が本当に重要でない限り、参照を収集するためにディスプレイリストの階層を使用しないことをお勧めします。たとえば、このメニューは、閉じるときに親コンテナから自分自身を削除したり、同じコンテナにdisplayObjectを追加する必要があり、コンテナが何であるかを気にしない場合があります。階層を使用すると、参照用にその階層を維持する必要があり、成長するアプリケーションで変更を加えることが困難になる場合があります。参照を収集するためにディスプレイリストを使用しない、探しているものの例を次に示します。
public class Main extends Sprite
{
private var menu:SubMenu;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
menu = new SubMenu(this);
addChild(menu) //This is not neccessary for them to communicate
dispatchEvent(new Event(Event.CHANGE));
}
}
public class SubMenu extends Sprite
{
private var mainMenu:IEventDispatcher; //This could be typed as Main instead of IEventDispatcher if needed.
//Sprites are however IEventDispatchers
public function SubMenu(mainMenu:IEventDispatcher)
{
this.mainMenu = mainMenu;
mainMenu.addEventListener(Event.CHANGE, switchItem, false, 0, true);
}
private function switchItem(event:Event):void
{
trace("Parent_Changed")
}
}
ディスプレイリスト階層を使用した例を次に示します(お勧めしません):
public class Main extends Sprite
{
private var menu:SubMenu;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
menu = new SubMenu();
addChild(menu) //This is neccessary, and the menu cannot be added to a different parent
dispatchEvent(new Event(Event.CHANGE));
}
}
public class SubMenu extends Sprite
{
public function SubMenu()
{
//Neccessary because submenu will not have a parent when its first instantiated.
//When its on the stage then you can have it grab its parent and add a listener.
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(event:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//Parents available
parent.addEventListener(Event.CHANGE, switchItem, false, 0, true);
}
private function switchItem(event:Event):void
{
trace("Parent_Changed")
}
}