集合

2011-01-21 17 views
1

內封裝引用類型的我聲明一類具有幾個特性集合

class Soil 
{ 
    public double AnglePhi { get; set; } 
    public double AngleDelta { get; set; } 
    . 
    . 
    . 
} 

現在操縱它們的集合,我又建了專用類,只有這個原因。

class Soils 
{ 
    private const Byte numberOPredefined = 10; 
    private IList<Soil> soils; 

    public Soil this[ushort i] 
    { 
    get { return new Soil() { AngleDelta = soils[i].AngleDelta, ... }; } 
    set { if (i > numberOPredefined) soils[i] = value; } 
    } 
    . 
    . 
    . 
} 

這個邏輯背後的邏輯是保護一些不受直接操縱每個土壤實例的屬性。在吸氣劑中給一個副本,要求在吸氣器中有一個「完整的」土壤物體。

從我紅迄今爲止,其他的解決方案可能是:
化妝土類不可變的,
回報只讀目錄(但隨後引用類型inseide進行操作)
轉土類結構(簡單) ,
增強土類與一些邏輯(方法等)。

我想問一下,上述「解決方案」是否有任何價值,或者是不明確的。

這是一個典型的情況,我認爲,例如有一個引用類型的集合,並且想要封裝他們。在這些情況下,典型的思維框架是什麼?

編輯:
好了,看完答案後,我修改瞭解決這個

class Soil 
{ 
    private readonly double _AnglePhi; 
    public double AnglePhi { get { return _AnglePhi; } } 

    private readonly double _AngleDelta; 
    public double AngleDelta { get { return _AngleDelta; } } 
    . 
    . 
} 

class SoilCollection 
{ 
    private List<Soil> _Soils; 
    public IList<Soil> Soils { get { return _Soils.AsReadOnly(); } } 
    . 
    . 
} 

我覺得它裏面的土類所需要的邏輯,而不是內部另一個類。如果我發現任何缺點,我會發布。

回答

2

如果你希望你的土壤類型有複製的語義,把它定義爲一個結構。你應該使它不可變,然後聲明後備字段爲只讀並添加一個合適的構造函數。

struct Soil 
{ 
    private readonly double anglePhi; 
    private readonly double angleDelta; 

    public Soil(double phi, double delta) { 
    this.anglePhi = phi; 
    this.angleDelta = delta; 
    } 

    public double AnglePhi { get { return anglePhi; } } 
    public double AngleDelta { get { return angleDelta; } } 
} 

如果保留它作爲類,我不會使用索引器來檢索對象的副本。我寧願使用一種方法來明確說明用戶正在獲取對象的副本。並使其成爲只讀,就像上面的結構一樣,就像類一樣。這可能也會消除複製的需要。

2

可以定義爲土壤的ValueObject 然後它會創建後是不變的:

class Soil 
{ 
    public Soil(double anglePhi, double angleDelta) 
    { 
     AnglePhi = anglePhi; 
     AngleDelta = angleDelta; 
    } 

    public double AnglePhi { get; private set; } 
    public double AngleDelta { get; private set; } 
} 

而且最好重新命名土壤對SoilCollection我想。

+0

您的意思是ValueObject這個鏈接解釋? http://blogs.msdn.com/b/lucabol/archive/2007/12/03/creating-an-immutable-value-object-in-c-part-i-using-a-class.aspx – 2011-01-21 09:50:51

+0

那麼,我沒有閱讀整篇文章,但是根據標題「YES」,價值對象是基於其狀態的對象,而不是它們在內存中的指針。不可變的值對象是一個不能改變的值對象。修改它的狀態,你必須創建新的。「 – 2011-01-21 10:02:35

+0

你對課程的命名是正確的。 – 2011-01-21 10:31:16

1

你沒有理由在Soil類上實現setter和getter。您可以選擇只執行get,這會使Soil對象只讀。

你顯然必須有其他方法來設置內部值 - 可以在構造函數中完成。

例如:

class Soil 
{ 
    private double m_anglePhi; 

    public Soil(double anglePhi) 
    { 
     m_anglePhi = anglePhi; 
    } 

    public double AnglePhi 
    { 
     get { return m_anglePhi; } 
    } 
} 
+0

謝謝你的回答。 – 2011-01-21 10:32:56

1

我會建議:

1)使土壤類不可變。 2)使土壤類成爲只讀集合。 如從IList派生出來的,並聲明add等方法作爲實際的顯式實現。