Есть несколько способов сделать это. Я предполагаю, что ваш MyClass
расширяется Sprite
.
<code>package
{
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
/**
* MyClass
*/
public class MyClass extends Sprite
{
public var referenceA:String;
public var referenceB:Sprite;</code>
<code>
public function get referenceA_way2():Sprite
{
return this.parent.getChildByName(referenceA);
}
/**
* MyClass Constructor
*/
public function MyClass(referenceA:String = null, referenceB:Sprite = null)
{
super();
this.referenceA = referenceA;
this.referenceB = referenceB;
}</code>
<code>
public function drawToOutsideSpriteA(child:DisplayObject):void
{
// referenceA
this.parent.getChildByName(this.referenceA).addChild(child);
// or
referenceA_way2.addChild(child);
}</code>
<code>
public function drawToOutsideSpriteB(child:DisplayObject):void
{
// referenceB
referenceB.addChild(child);
}</code>
<code>
public function drawToOutsideSpriteC(referenceC:String, child:DisplayObject):void
{
this.parent.getChildByName(referenceC).addChild(child);
}</code>
<code>
// Do this:
// it allows you to abstract out the logic of getting the main sprite
// into some util class, so you could reuse that functionality elsewhere,
// and so your code is cleaner.
public function drawToOutsideSpriteD(child:DisplayObject):void
{
StageUtil.getMainSprite().addChild(child);
}
}
}</code>
<code>
package
{
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
/**
* MyClass
*/
public class StageUtil
{
private static var root:Stage;</code>
<code>
/**
* Called when app first starts
*/
public static function initialize(stage:Stage):void
{
root = stage;
}</code>
<code>
public static function getMainSprite():DisplayObjectContainer
{
return root; // or something more complex,
// like a recursive function to getSpriteByName
}</code>
<code>
public static function addToStage(child:DisplayObject):DisplayObject
{
return getMainSprite().addChild(child);
}
}
}</code>
В общем, я бы абстрагировал логику для получения "основного" спрайта в некоторый класс util / manager, потому что вы не хотите жестко закодировать это в свой MyClass, поскольку вам это может понадобиться в других местах, и вы могли бы хочу настроить его позже. Похоже, вы просто спрашиваете, как лучше всего ссылаться на спрайты вне области действия MyClass, поэтому я просто говорю, что поместите его в Util, предполагая, что у него есть веская причина быть их (например, FlexGlobals.topLevelApplication во Flex, так что вы можете легко получить доступ к приложению).
Я не рекомендую передавать id
или name
в конструктор и делать это таким образом, я вообще не рекомендую аргументы конструктора вообще. Я бы просто передал их в метод, если вам нужно, или он встроен в сам класс или Util.
Чтобы немного прояснить вопрос об области видимости ... Обычно вы не хотите рисовать спрайты вне области действия класса, в котором вы находитесь, если только они не обладают какой-то специальной функциональностью, на которую ссылаются несколько классов с совершенно разными прицелы. Это потому, что вещи не имеют смысла, кто добавляется к кому. Но некоторые хорошие примеры того, когда это сделать, включают:
- Кнопки с всплывающими подсказками: подсказки добавляются в корень, потому что они отображаются поверх всего, но кнопка может иметь глубину 20 дочерних элементов, поэтому вы можете иметь в подклассе Button, возможно,
addToolTip(child)
.
- Всплывающие окна: вы можете добавить всплывающее окно из MyClass, но оно действительно добавляется на сцену. В flex это как
PopUpManager.addPopUp(child)
, так же как и в примере StageUtil.getMainSprite().addChild(child)
. Вы могли бы даже обернуть этот метод, чтобы он был похож на тот, что в классе выше, addToStage
.
- Стадия трансформации / рисования: Если у вас есть какой-то глобальный этап рисования или место, где вы масштабируете / изменяете размеры, вы можете захотеть добавить / удалить графику из этого класса из любого класса.
Метод super()
в этом сценарии бесполезен. Единственный раз, когда вы действительно используете super()
, это если вы переопределили метод и хотите получить доступ к реализации суперклассов. Примерно так (при условии, что вы расширяете Sprite):
<code>override public function addChild(child:DisplayObject):DisplayObject
{
if (child is MyDrawingSprite)
return StageUtil.addToStage(child); // add to main stage
else
return super.addChild(child); // add directly to this class
}</code>
В противном случае попробуйте просто добавить детей непосредственно в «Мой класс».
Надеюсь, это поможет.