集合

2011-01-21 16 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等方法作为实际的显式实现。