有几个方法可以做到这一点。我假设你的MyClass
延伸Sprite
。
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;
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; }
public function drawToOutsideSpriteA(child:DisplayObject):void { // referenceA this.parent.getChildByName(this.referenceA).addChild(child); // or referenceA_way2.addChild(child); }
public function drawToOutsideSpriteB(child:DisplayObject):void { // referenceB referenceB.addChild(child); }
public function drawToOutsideSpriteC(referenceC:String, child:DisplayObject):void { this.parent.getChildByName(referenceC).addChild(child); }
// 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); } } }
package { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Sprite; /** * MyClass */ public class StageUtil { private static var root:Stage;
/** * Called when app first starts */ public static function initialize(stage:Stage):void { root = stage; }
public static function getMainSprite():DisplayObjectContainer { return root; // or something more complex, // like a recursive function to getSpriteByName }
public static function addToStage(child:DisplayObject):DisplayObject { return getMainSprite().addChild(child); } } }
总的来说,我会抽象出对获得“主”精灵到一些UTIL /经理类,因为你不想硬编码到你的MyClass的,因为你可能需要它在逻辑其他地方,你可能想在稍后进行定制。这听起来像你只是问什么是在MyClass范围之外引用sprites的最好方法,所以我说只是把它放到Util中,假设它有很好的理由(比如Flex中的FlexGlobals.topLevelApplication,所以你可以轻松访问应用程序)。
我不建议将id
或name
的构造函数传递给构造函数,并且这样做,我根本不推荐构造函数参数。如果需要的话,我可以将它们传递给方法,或者将其内置到类本身或Util中。
要清除范围问题有点...通常不想绘制到你所在类的范围之外的精灵,除非他们有一些特殊的功能将被多个类共同引用不同的范围。这是因为事情开始没有意义,谁加入了谁。但在什么时候做thatinclude一些很好的例子:
- 按钮工具提示:因为他们出现在一切之上的工具提示添加到根,但巴顿可能是20个孩子深,所以你必须在Button子类,或许是
addToolTip(child)
。
- PopUps:你可能想从MyClass中添加一个弹出窗口,但它真的被添加到舞台上。在flex中,这就像
PopUpManager.addPopUp(child)
,就像样本StageUtil.getMainSprite().addChild(child)
一样。你甚至可以包装该方法,以便像上面的类中那样,addToStage
。
- 变换/绘图阶段:如果您有一些全局绘画阶段,或者您调整/调整大小的地方,您可能希望能够从任何课程中添加/删除图形。
super()
方法在这种情况下没有用。你真的使用super()
的唯一时间是如果你重写了一个方法,并且想要访问超级类的实现。像这样的东西(假设你扩展雪碧):
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 }
否则,尝试坚持只是直接将孩子送到“MyClass的”。
希望有所帮助。
OK;我看到一件事情,我有一个问题: 即使我使用StageUtil类方法,是否还必须调用super()? 我不认为我必须,对吧? 也许有人可以向我解释在什么情况下绝对有必要打电话给超级... 谢谢, jml – jml 2009-12-26 17:08:37
你不需要调用超级,除非你重写一个方法,你想在某些点执行超类功能。 – 2009-12-26 18:46:40
真棒。谢谢您的帮助。 – jml 2009-12-26 22:44:25