2011-10-22 71 views
0

我有一個簡單的問題,在下面的例子中,當我創建一個新的TransitionManager,並通過this作爲參數發生錯誤發生,說Implicit強制this是類型Class.Why我爲了工作,我認爲物體在擴展它後會變成一個MovieClip。AS3參數強制

package { 

import fl.transitions.*; 
import fl.transitions.easing.*; 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 

public class Border extends MovieClip 
{ 
    var trManager:TransitionManager = new TransitionManager(MovieClip(this)); //<-- 

    public function Border() { 
    } 

    public function doRotate (ev : MouseEvent) 
    { 
     trManager.startTransition({type:Rotate, direction:Transition.OUT, duration:3, easing:Strong.easeInOut, ccw:false, degrees:90}); 
    } 
    } 
} 

回答

1

這似乎是你偶然發現了一個奇怪的Flex編譯器。

有段時間,好像this引用了靜態類的類型,但我錯了,它似乎只是編譯器中的一個錯誤,在編譯時誤解了this的類型。

雖然我不推薦使用這種方法,因爲成員將在構造函數被調用之前被初始化。看看這個例子:

package 
{ 
    public class Foo 
    { 
     private var bar1:Bar = new Bar("at bar1", Foo(this)); 

     public function Foo() 
     { 
      var bar2:Bar = new Bar("in constructor", this); 
     } 

     private var bar3:Bar = new Bar("at bar3", Foo(this)); 
    } 
} 

class Bar { 

    public function Bar(scope: String, x:*):void { 
     trace(scope, x is Foo); 
    } 

} 

和明顯的答案是:

at bar1 true 
at bar3 true 
in constructor true 

如果構造函數實際上是假設做一些真正的初始化,你會真正使用它初始化。

總而言之,保持簡單,在構造函數中移動字段初始化,這就是他們無論如何。

var trManager:TransitionManager; 

public function Border() { 
    trManager = new TransitionManager(this); 
} 
+0

感謝非常有建設性的,雖然我是一個有點困惑與線'uninitialized'.If這讓我使用Flash任何區別,你會真正使用它。 –

+0

對不起,我想我沒有清楚地表達自己。不是一個大問題,只是要注意的東西.. 如果您檢查我的例子的輸出,你會注意到構造函數體最後執行。想象一下你有一個構造函數,它有幾個參數可以設置給類的一些成員。如果使用'this'來初始化其他成員,那麼這些參數將不會被設置。 –

+0

好吧,我明白你在說什麼。我有一個問題,你怎麼能傳遞一個參數到'Foo(this)',因爲構造函數沒有設置爲接受參數? –