2011-10-24 245 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並創建一個只讀集合,它可以從普通列表中複製構建自己,然後使用屬性返回不可變列表。