假设在文档类
中public class Test extends MovieClip
{
public function Test()
{
var object1:ClassA = new ClassA();
//addChild(object1);
object1.accessRoot();
}
}
public class A extends MovieClip
{
public function accessRoot()
{
var mc : MovieClip = root as MovieClip;
mc.box.visible = false;
}
}
现在盒子放在舞台上。但是当A类被添加到Test Class时,它可以工作,当A类的对象没有被添加到Test构造函数中时,root变得无法访问。是否存在不在display-list上的对象可以访问root或display-list对象的方法?
答案 0 :(得分:3)
我不建议您的课程使用root或stage,这样可以更好地分派事件并进行适当的封装。
Hacky方式:
public class A extends MovieClip
{
private var _root:MovieClip;
public function A(root:MovieClip)
{
_root = root;
}
public function accessRoot()
{
_root.box.visible = false;
}
}
正确的方法:
public class A extends MovieClip
{
public static const ACCESS_ROOT:String = "access_root";
public function accessRoot()
{
dispatchEvent(new Event(ACCESS_ROOT));
}
}
// in your document class
var myA:A = new A();
myA.addEventListener(A.ACCESS_ROOT, handleAccessRoot);
public function handleAccessRoot(e:Event):void{
box.visible = false;
}
答案 1 :(得分:0)
我通常创建一种基类,它包含对文档类的引用 - 或“main”类。我在这里创建的任何东西都需要引用Main中定义的任何内容,这将扩展Element。例如:
Main类(或文档类):
public class Main extends MovieClip
{
/**
* Constructor
*/
public function Main()
{
var obj:MyElement = new MyElement();
obj.main = this;
// stage will be outputted
}
}
元素 - 存储对主类的引用。
它还包含一个init()
函数,我通常通过覆盖它来代替构造函数。
public class Element extends MovieClip
{
private var _main:Test;
public function set main(m:Main):void
{
_main = m;
init();
}
/**
* Called when _main is defined
*/
protected function init():void
{
// override me
}
public function get main():Main{ return _main; }
}
以下是如何使用Element作为类的基类:
public class ClassA extends Element
{
/**
* Override init rather than using a constructor
*/
override protected function init():void
{
trace(main.stage);
}
}
唯一需要注意的是,您必须在创建对象时设置_main属性。 (如Main的第9行所示)。