向属性的属性添加功能
本文关键字:属性 功能 添加 | 更新日期: 2023-09-27 18:12:09
我有一个名为Graph的对象
我在图类的顶点列表。类看起来是这样的。这是一个。net 2.0代码。
public class Graph
{
public List<Vertex> Vertices
{
get{ return _vertices}
}
} private List<Vertex> _vertices;
这是我的问题。我想在将顶点对象添加到图形对象之前验证它(通过调用Vertex. isvalid()方法)。
最好的方法是什么?我喜欢在属性的getter块中添加代码的方式。有类似的方法吗?
我有变通办法,但希望以最好的方式做到这一点。
最好的解决方案是不将顶点列表公开为可变列表。相反,如果您需要一个Vertices
属性,让它返回一个只读数据结构。然后,只需包含一个Add()
方法,并验证您想要的所有内容:
public ReadOnlyCollection<Vertex> Vertices
{
get { return _vertices.AsReadOnly(); }
}
public void Add(Vertex vertex)
{
if (vertex.IsValid())
_vertices.Add(vertex);
}
对于类似的情况,我的解决方案是添加一个辅助方法来向Graph添加顶点对象,如下所示:
public void AddVertex(Vertex vertex)
{
if (vertex.IsValid())
_vertices.Add(vertex);
}
如果你没有大量的图形对象,图形通常有顶点,我会预先分配列表集合,所以它总是空的,永远不会空(我认为在这种特殊情况下,这可能是一个好主意)。否则,你的AddVertex方法将不得不检查_vertices是否为空并分配List。在这种情况下,我通常会创建CreateVertices()方法,如果List为null,则该方法会分配List,这样它也可以在必要时在类的其他方法中使用,甚至可以由类的用户使用。最简单的方法是总是预先分配集合,但我个人避免这样做,如果有大量的类实例,并且集合通常可以不使用。
当然,这个解决方案并不完美,因为List不是不可变的——类的用户可以使用Vertices属性来获取列表,并对其直接执行Add()操作。对此,我唯一的解决方案是提供文档——比如在Vertices属性上添加注释标签,说明添加的正确方法。c#可以从将返回集合标记为只读的方法中获益。如果您迫切需要这样做,您可以包装List并创建一个只读集合,该集合可以从普通List复制构造自己,然后返回带有属性的不可变列表。
可以尝试这样做,一个伪代码:
编辑
扩展方法 public static class MyCoolVertex
{
public static void AddVertexAndValidate(this List<int> list, Vertex value)
{
if(value.IsValid())
list.Add(value);
}
}
之后使用AddVertexAndValidate
法。
Good:基本上你完成了
Bad:你不能阻止某人调用列表上的Add
,这样就违反了你的工作流程。