我想知道(根据范围规则)我如何做以下事情: 我想绘制一个存在于主舞台上的精灵,我在其中实例化了一个类。
类似
public function MyClass(reference:String){
this.reference = reference;
}
public function drawToOutsideSprite(){
this.parent.getChildByName(this.reference).addChild(someLoaderName);
}
在这种情况下我会使用super(),或者通常的方法是什么?
谢谢, JML
答案 0 :(得分:1)
有几种方法可以做到这一点。我假设您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 / manager类的逻辑,因为你不想将它硬编码到你的MyClass中,因为你可能在其他地方需要它,你可能会想要在以后定制它。听起来你只是问你在MyClass范围之外引用sprite的最佳方法是什么,所以我说只是把它放到Util中,假设它有充分的理由成为他们(就像Flex中的FlexGlobals.topLevelApplication,所以你可以轻松访问应用程序)。
我不建议将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;
}
传入构造函数并以此方式执行,我根本不推荐构造函数参数。如果你需要的话,我会将它们传递给一个方法,或者将它们内置到类本身或者Util中。
稍微澄清一下范围界定问题...你通常不想在你所在类的范围之外绘制精灵,除非它们有一些特殊的功能,这些功能将由多个完全不同的类引用范围。这是因为事情开始没有意义,谁被添加到谁。但是关于何时这样做的一些好例子包括:
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;
}
的唯一情况是,如果您已重写方法,并希望访问超类实现。这样的事情(假设你正在扩展Sprite):
public static function getMainSprite():DisplayObjectContainer
{
return root; // or something more complex,
// like a recursive function to getSpriteByName
}
否则,请尽量将孩子直接添加到“MyClass”。
希望有所帮助。