0

我试图从 List 派生并有选择地打开和关闭IsReadOnly属性。我希望 Add/Remove/[] 函数会尊重这个属性,但他们没有。这样做的正确方法是什么?

我的派生类有一些额外的属性,所以很遗憾我不能将列表包装在 ReadOnlyCollection 中。

4

3 回答 3

7

在这种情况下使用封装而不是继承。

你应该让你的类实现 IList<T>,并有一个私有的 List<T> 变量。

你可以通过任何你想要的函数,也可以完全覆盖它们,改变行为等。这给了你完全的控制权(代价是有很多方法除了调用 this.List.method(...) 之外什么都不做) .

一般来说,我认为在任何情况下从 BCL 集合类继承都不是一个好主意。我更喜欢让它们成为我班级内部的实现细节。

于 2009-04-22T19:43:39.467 回答
2

您可以调用 list 上的“AsReadOnly”方法,该方法应该返回给您一个 IList 实例,该实例应该尊重它是...错误...只读的。

...好吧,我刚刚读了你的最后一句话,我的错。在这种情况下,您可能只想实现 IList 接口或任何朋友,并将大部分接口路由到您在内部保留的列表。然后你可以建立这种行为。即便如此,我会做一个类似的模式,提供一些“AsReadOnly”方法,明确地给你一些只读的东西。

于 2009-04-22T19:42:34.523 回答
2

List<T> 根据定义是可变类型。没有办法让它只读。

如果您正在创建派生类,则可能应该直接实现 IList<T> 而不是子类化 List<T> 。这将使您可以完全控制实施,如果您愿意,可以将其设为只读。

于 2009-04-22T19:43:56.157 回答