2015-03-18 30 views
2

我正在寫一個不可變的類Vector3。構造函數如何使用複雜算法初始化最終字段?

class Vector3 
{ 
    final num x, y, z; 
    Vector3(this.x, this.y, this.z); 
    num get length => ...some heavy code 
} 

現在,我想寫一個構造函數來計算另一個向量的單位向量。我想根據Dart的建議來做到這一點(避免在創建新對象時編寫靜態方法)。

我的問題是,我不能寫這個構造函數,因爲最終的字段必須在構造函數的主體之前初始化,並且不能在裏面初始化。我可以寫這樣的:

Vector3.unit(Vector3 vector) 
    : x = vector.x/vector.length, 
    y = vector.y/vector.length, 
    z = vector.z/vector.length; 

但是,這是太難過我需要計算向量的三倍長...

我應該怎樣做呢?我最終應該寫一個靜態方法來計算單位矢量嗎? (這將是一個恥辱)

最後,不可能在構造函數的主體中寫入與最終字段的初始化有關的任何內容嗎?爲什麼?

謝謝!

回答

4

使用工廠構造函數:

class Vector3 
{ 
    final num x, y, z; 
    Vector3(this.x, this.y, this.z); 

    factory Vector3.unit(Vector3 vector) { 
    var length = vector.length; 
    return new Vector3(vector.x/length, vector.y/length, vector.z/length); 
    } 

    num get length => ...some heavy code 
} 
+0

謝謝,這個解決方案是完美的:) – Hemel 2015-03-19 10:49:14

+1

我還考慮將其添加爲一個方法:'的Vector3 scaleTo([INT長度= 1]);'。當你有一個構造函數將另一個值作爲輸入時,它通常可以轉換爲另一個值的方法 - 至少當它是同一個類時。 – lrn 2015-03-20 09:02:44

相關問題