2010-12-10 131 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

相關問題