2012-12-31 69 views
0

這是一流的球是來自飛鏢樣本(時鐘採樣)的一部分:構造混亂

DivElement root 
    num lastTime; 
    List<Ball> balls; 

球():

lastTime = new Date.now().millisecondsSinceEpoch,   
balls = new List<Ball>() {       \\I do not understand here, why use        
root = new DivElement();        \\ List<Ball>(){...} 
document.body.nodes.add(root); 
makeAbsolute(root); 
setElementSize(root, 0.0, 0.0, 0.0, 0.0); 
} 

因爲我不明白,我改變構造函數:

Balls() { 

    lastTime = new Date.now().millisecondsSinceEpoch; 
    balls = new List<Ball>() ; 
    root = new DivElement(); 
    document.body.nodes.add(root); 
    makeAbsolute(root); 
    setElementSize(root, 0.0, 0.0, 0.0, 0.0); 

    } 

該應用程序仍然有效。構造函數Ball():and Ball(){}之間有什麼不同嗎?謝謝。
對不起,我的英語。

回答

2

兩個版本都應該正常工作。在:符號的代碼構造函數體前跑,所以它經常被用來搞什麼叫超:

class Person { 
    String name; 

    Person(this.name); 
} 

class Employee extends Person { 
    Employee(name) : super(name) { 
    print('ran after the super call'); 
    } 
} 

我覺得函數體是一個更簡潔的方法,我相信「球」例如要展示關閉不同的樣式,因爲您也可以初始化內聯值。

我通常使用函數體的方法,除非它看起來更乾淨或我打電話給父構造函數。

更新: Ladicek增加了公平點。您可以初始化final內嵌字段或初始化程序列表中的字段。與某些語言不同的是,在Dart中,這些字段永遠不會處於未初始化狀態。還應該記住初始化器按照它們列出的順序運行。

+0

謝謝。你的答案總是很好。 – duy

+0

':'後面的代碼被稱爲_initializer list_,它實際上非常重要。這就是Dart如何修復Java或C#與構造函數之間的初始化問題 - 在構造函數體內,當實例尚未完全初始化時,可以將此'this'傳遞給任何其他代碼。這就是你如何觀察Java中的'final'字段以獲得_two_值。這就是爲什麼初始化器列表如此重要:Dart要求你初始化初始化器列表中的所有'final'字段(除非它們在其聲明中「inline」初始化),這可以防止這些問題。 – Ladicek