2011-09-24 31 views

回答

28

如果閃光燈無法探測出你的孩子構造函數super()一個電話,然後閃將隱式調用super()之前你的孩子的構造。所以:

public class Parent { 
    public function Parent() { 
     trace("Parent"); 
    } 
} 

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
    } 
} 

new Child(); 
// Parent 
// Child 

所以,你的孩子基本的構造看起來像這樣

public function Child() { 
     super(); // <-- Added by flash! 
     trace("Child"); 
    } 

所以,不,省略顯式調用super()不會通常不利孩子的班級影響。

那麼,爲什麼你要明確地打電話給super()

第一個原因是閃存僅會自動生成一個無參數調用super,也就是說,如果你的父類的構造函數需要參數,那麼你需要使用這些參數顯式調用它。如果您在這種情況下忽略了super(args...)調用,您將收到編譯器錯誤。其次,如果連父母都有一個無參數的構造函數,那麼可以使用super()來控制構造函數執行的順序。 Flash將始終在子構造函數之前插入該調用。所以如果你想改變這個順序。然後

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
     super() 
    } 
} 

會以相反的順序。或者你可以這樣做:

public class Child extends Parent { 
    public function Child() { 
     if(false) super() 
    } 
} 

因爲閃光燈看到有一個電話,它不:

public class Child extends Parent { 
    public function Child() { 
     // work before initilizing parent 
     super() 
     // work after initilizing parent 
    } 
} 

最後,還有一個很模糊的方式來說你父母打電話構造插入一個。但是因爲它的後面一個if (false)它永遠不會被調用,所以父類永遠不會被初始化。

+0

感謝偉大的答案之前!你怎麼知道這個祕密功能(自動超級插入)? –

+4

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - 在部分名爲**構造函數方法** –

+1

抑制父構造函數意味着沒有任何祖先構造函數被調用或只是直接的超類? –

1

您可以安全地排除對基礎構造函數的調用。如果在構造函數中不調用super(),則編譯器將向不帶參數的基構造函數添加一個調用。

4

如果你不明確地調用super(),Flash會自動執行之前所有其他代碼在你的構造函數中。

如果您明確地致電super(),它將在您寫它的行上被調用。

但是,請注意,你不能設置或獲取任何thissuper屬性或調用任何方法的超類實例化

相關問題