當我擴展Sprite時,我總是不會調用super()。
但是不是not calling super()
會導致任何問題?
到現在爲止,我沒有任何問題,我從來沒有見過在構造函數中調用super()的代碼,該類擴展了Sprite。
TextField怎麼樣?
我對TextField也沒有任何問題。
如何知道我是否應該調用super()?當類擴展Sprite在actionscript3中時,我不必在構造函數中調用super()嗎?
5
A
回答
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)
它永遠不會被調用,所以父類永遠不會被初始化。
1
您可以安全地排除對基礎構造函數的調用。如果在構造函數中不調用super()
,則編譯器將向不帶參數的基構造函數添加一個調用。
4
如果你不明確地調用super()
,Flash會自動執行之前所有其他代碼在你的構造函數中。
如果您明確地致電super()
,它將在您寫它的行上被調用。
但是,請注意,你不能設置或獲取任何this
或super
屬性或調用任何方法的超類實例化
相關問題
- 1. 當我在UITableView中實現-scrollViewDidScroll:UIScrollViewDelegate時,我必須調用super嗎?
- 2. Java中擴展類的構造函數
- 3. 在Dojo類上調用構造函數使用dojo.extend擴展
- 4. 對於結構體,我必須在C#中顯式調用構造函數嗎?
- 5. Mockito.spy VerifyError:構造函數必須調用super()或this()
- 6. 在Java中調用super的構造函數聲明
- 7. 構造函數調用必須是super()中的構造函數中的第一條語句
- 8. 當從構造函數中調用關鍵字「super」時如何工作?
- 9. 在C#.NET構造函數中擴展類和重寫屬性
- 10. 在擴展類(裝飾器模式)中重寫構造函數
- 11. 在構造函數中保存擴展類的'方法'名稱
- 12. 從類擴展構造函數
- 13. 擴展類並將所有構造函數參數傳遞給super
- 14. 構造函數不在C++中調用
- 15. super()在沒有繼承的類的構造函數中
- 16. super()調用必須是構造函數體中的第一條語句
- 17. 調用super必須是構造函數中的第一條語句,但它是
- 18. C#繼承:當我調用派生類構造函數時如何調用基類構造函數
- 19. Java - 擴展似乎是調用其他類的構造函數
- 20. 構造函數super()es6 angularjs
- 21. 未在擴展PHP DOMElement上調用的構造函數
- 22. 錯誤:調用super之外類的構造函數的
- 23. Ormlite - 構造函數調用失敗時BaseDaoImpl擴展
- 24. 我可以在參數包擴展中調用所有基類的函數嗎?
- 25. 使用Java中的默認構造函數擴展類
- 26. 在父構造函數之前調用子類構造函數
- 27. 構造函數可以在C++中調用另一個構造函數嗎?
- 28. 什麼時候需要從構造函數調用`super`?
- 29. 如何在其他構造函數中調用構造函數?
- 30. 在java中調用繼承構造函數的構造函數
感謝偉大的答案之前!你怎麼知道這個祕密功能(自動超級插入)? –
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - 在部分名爲**構造函數方法** –
抑制父構造函數意味着沒有任何祖先構造函數被調用或只是直接的超類? –