2009-04-22 39 views
0

我試圖從列表中導出並選擇性地打開和關閉IsReadOnly屬性。我希望添加/刪除/ []功能會兌現這個屬性,但他們不。 這樣做的正確方法是什麼?如何覆蓋列表<T> .IsReadOnly在C#

我的派生類有一些額外的屬性,所以我不能不幸地只是將列表包裝在ReadOnlyCollection中。

回答

7

在這種情況下使用封裝而不是繼承。

你應該讓你的課程實施IList <T>,並有一個私人列表<T>變量。你可以通過你想要的任何函數,但也可以完全覆蓋它們,改變行爲等等。這給你完全的控制權(代價是有很多方法什麼也不做,只是調用this.List.method()而不是其他方法。 ..))。

一般來說,我不認爲從任何情況下繼承BCL集合類都不是一個好主意。我更喜歡讓他們成爲我班內部的實現細節。

2

您可以在列表中調用「AsReadOnly」方法,該方法應該返回給您一個IList實例,該實例應該承認它是......錯誤......只讀。

...好吧,我剛剛讀了你最後一句話,我的壞話。在這種情況下,您可能只想實現IList接口或任何朋友,並將大部分接口路由到內部保存的列表。然後你可以建立這種行爲。即使如此,我也會做類似的模式,提供一些「AsReadOnly」方法,明確給你一些只讀的東西。

2

列表<T>定義爲可變類型。無法將其設置爲只讀。

如果您正在製作派生類,那麼您應該直接實施IList <T>而不是繼承子列表<T>。這將使您完全控制實施,只要您願意,您可以將其設置爲只讀。