2010-12-10 130 views
0

快速问题。我整个早上一直在Google上搜索,但它要么不在那里,要么以未注册的方式书写。我倾向于相信后者,因为这看起来应该对我来说完全无关紧要。如何从Actionscript 3.0中的另一个类实例引用一个类实例?

我使用AS 3.0制作了一个小型Flash文件,这是我第一次真正能够坚持OOP的做事方式,而不是将时间线上的东西混合在一起,让所有的东西都在课堂上工作。

所以我想保持这种方式,但有一件事是让我难以理解的:我无法调用另一个类的实例的方法(而不是我调用的方法),而无需诉诸“DocumentClass (根).instanceName.method“。直觉告诉我必须有一个更好的方法来做到这一点(比如,每次我调用另一个类实例的函数时不必引用文档类;并且一定不用“root”这个词 - 只是似乎因此Flash 5我

没有任何人有这样做的更好的方式,他们可以共享

在此先感谢SS

编辑:?!下面是一些相关的代码: 主类:

package myApp { 

    import flash.display.*; 
    import flash.events.*; 

    public class Main extends flash.display.MovieClip { 

     public var background; 

     public var control; 

     public function Main() { 

      //load the background 
      this.background = new Background(); 
      this.addChild(background); 

      //load the control 
      this.control = new Control; 
      this.addChild(control); 
     } 
    } 
} 

背景类:

package myApp { 

    import flash.display.*; 
    import flash.events.*; 

    public class Background extends flash.display.MovieClip { 

     public function Background() { 
      this.x = 0; 
      this.y = 0; 
     } 

     public function doSomething() { 
      //do something here 
     } 

    } 
} 

控制类:

package myApp { 

    import flash.display.*; 
    import flash.events.*; 

    public class Control extends flash.display.MovieClip { 

     private var section01; 
     private var section02; 
     private var section03; 

     public function Control() { 

      //some constructor code here 

     } 

     public function doSomethingCaller() { 
      MyApp(root).background.doSomething(); <--- HERE 
     } 
    } 
} 

回答

1

你可以试试下面的办法:

package 
{ 
    import com.A; 
    import com.B; 
    import flash.display.MovieClip; 

    public class Main extends MovieClip 
    { 
     private var _a:A; 
     private var _b:B; 

     public function get a():A 
     { 
      return _a; 

     }// end function 

     public function Main():void 
     { 
      init(); 

     }// end function 

     private function init():void 
     { 
      _a = new A(); 
      _b = new B(this); 

     }// end function 

    }// end class 

}// end package 

在你的文档类 “主”,等级“A “和”B“是进口的。 “A”和“B”类的“Main”类中声明了私有属性“_a”和“_b”。接下来有一个名为“a”的getter方法返回“_a”。接下来是一个名为“init()”的私有方法,可以从“Main”类的构造函数调用。在“init()”方法中,“_a”和“_b”属性被实例化,但是对于“_b”,使用“this”关键字来解析对“Main”的引用。

package com 
{ 
    import flash.display.MovieClip; 

    public class A extends MovieClip 
    { 
     public function A():void {}// end function 

     public function traceClassName():void 
     { 
      trace("Class name: A"); 

     }// end function 

    }// end class 

}// end package 

在类“A”中有一个名为“traceClassName()”的公共方法,它在调用时跟踪字符串“Class name:A”。

package com 
{ 
    public class B 
    { 
     private var _main; 

     public function B(p_main):void 
     { 
      _main = p_main; 
      _main.a.traceClassName(); 

     }// end function 

    }// end class 

}// end package 

在类“B”中,您有一个名为“_main”的私有属性。在“B”类的构造函数中,当“B”类被实例化时,有一个参数用于Main类的引用。然后将“_main”属性分配给“Main”类的引用。现在,您可以通过“B”类中的“Main”类的引用来访问“A”的实例。

有很多方法,这只是其中一种更简单的方法,虽然我认为有更好的方法。您应该提供您的Flash应用程序/电影的源代码,以便我和其他人可以更好地了解哪个适合您。

我希望这有助于:)

+0

对不起,但这只是在我的头上。就像,我不明白你为什么要将额外的类导入到你的Main类中,并且这让我想我可能做错了什么。让我在上面发布一些代码,也许你会看到我在说什么。 – StormShadow 2010-12-10 08:42:29

相关问题