如何在C#</t>中覆盖List <t> .IsReadOnly

时间:2009-04-22 19:40:32

标签: c# properties override readonly

我正在尝试从List派生并有选择地打开和关闭 IsReadOnly 属性。我希望Add / Remove / []函数能够使用这个属性,但它们不会。 这样做的正确方法是什么?

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

3 个答案:

答案 0 :(得分:7)

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

您应该让您的课程实现IList&lt; T&gt;,并拥有一个私人列表&lt; T&gt;变量

你可以通过你想要的任何功能,但也可以完全覆盖它们,改变行为等。这使你完全控制(代价是有许多方法除了调用this.List.method(.. 。))。

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

答案 1 :(得分:2)

您可以在列表上调用“AsReadOnly”方法,该方法应该返回一个IList实例,该实例应该承认它是...错误...只读。

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

答案 2 :(得分:2)

列表与LT; T&GT;根据定义,它是一种可变类型。没有办法让它成为只读。

如果您正在创建派生类,那么您可能应该实现IList&lt; T&gt;直接而不是继承List&lt; T&gt;无论如何。这将使您完全控制实现,允许您在需要时将其设置为只读。