2011-10-24 318 views
1

我有一个名为Graph的对象。将属性添加到属性

我有Graph类中的顶点列表。所以这个类有点像这样。它的.Net 2.0代码。

public class Graph 
{ 
    public List<Vertex> Vertices 
    { 
     get{ return _vertices} 
    } 
} private List<Vertex> _vertices; 

这是我的问题。我想在将它添加到Graph对象之前验证Vertex对象(通过调用Vertex.IsValid()方法)。

这样做的最佳方法是什么?我喜欢在属性的getter块中添加代码的方式。有没有类似的方法呢?

我有解决方法,但希望以尽可能最好的方式做到这一点。

+0

你的“解决方法”是什么?至少有一个例子。在.Net 2.0中,你没有扩展方法......因此,看到你认为的工作将有助于提供你正在尝试做什么的完整图像。 – IAbstract

回答

2

最好的解决办法是不要暴露顶点列表作为一个可变的列表。相反,如果你需要一个Vertices属性,使它返回一个只读的数据结构。然后,就包括Add()方法,并验证所有你想要的:

public ReadOnlyCollection<Vertex> Vertices 
{ 
    get { return _vertices.AsReadOnly(); } 
} 

public void Add(Vertex vertex) 
{ 
    if (vertex.IsValid()) 
     _vertices.Add(vertex); 
} 
+1

所以你想防止设置顶点,但是在需要设置器的情况下,它会在某些情况下使硬编码变得困难。 –

+0

@Saeed我们给出的唯一限制是“确保添加的顶点是有效的。”这样做的典型方法是确保添加由包含类来调解。公开一个完全可变的列表意味着限制是没有意义的。对于图形来说,无论如何都是“设置”顶点的理由很少。你添加它们(也许删除它们)。并不难。 – dlev

1

可以尝试这样的事情,一个

编辑

扩展方法

public static class MyCoolVertex 
    { 
     public static void AddVertexAndValidate(this List<int> list, Vertex value) 
     { 
      if(value.IsValid()) 
       list.Add(value); 
     } 
    } 

而这种使用方法AddVertexAndValidate后。

:基本上,你做

:你不能阻止别人打电话只是Add名单上,并以这种方式侵犯您的工作流程。

希望这有助于..

+1

这实际上没有帮助。 'Vertices'是编译时类型'List ',这意味着你的类的隐藏'Add()'方法将不会被调用。 – dlev

+0

嗨@Tigran,谢谢你的回答。但是有一个派生类是我在问题中提到的解决方法。我只是想知道是否有任何方法可以做到这一点,否则。 – SaravananArumugam

+3

为什么Vertices应该作为接口而不是List实现暴露的重要原因 – Vadim

2

我对类似情况的解决办法是增加一个辅助方法来添加顶点对象图,像这样:

public void AddVertex(Vertex vertex) 
{ 
    if (vertex.IsValid()) 
     _vertices.Add(vertex); 
} 

如果你没有大量的Graph对象,而Graph通常有Vertex,我会预先分配List集合,所以它总是空的并且永远不为空(我认为在这种情况下这可能是个好主意)。否则,你的AddVertex方法将不得不检查_vertices为空并分配List。在这样的情况下,我通常会创建一个CreateVertices()方法来分配List,如果它是null的话,那么它也可以用在类的其他方法中,如果有必要的话甚至是类的用户。简单的解决方法是始终预先分配集合,但如果有大量类的实例并且集合通常可能未被使用,我个人就会避免这种情况。当然,这个解决方案并不完美,因为List不是不可变的 - 类的用户可以使用Vertices属性来获取列表,并直接对其执行Add()。我唯一的解决方案是文档 - 例如Vertices属性上的备注标记,它解释了添加到它的正确方法。 C#可以受益于将返回的集合标记为只读的方式。如果你急于这样做,你可以包装List并创建一个只读集合,它可以从普通列表中复制构建自己,然后使用属性返回不可变列表。