我正在尝试从List派生并有选择地打开和关闭 IsReadOnly 属性。我希望Add / Remove / []函数能够使用这个属性,但它们不会。 这样做的正确方法是什么?
我的派生类有一些额外的属性,所以我不能简单地将列表包装在ReadOnlyCollection中。
答案 0 :(得分:7)
在这种情况下使用封装而不是继承。
您应该让您的课程实现IList< T>,并拥有一个私人列表< T>变量
你可以通过你想要的任何功能,但也可以完全覆盖它们,改变行为等。这使你完全控制(代价是有许多方法除了调用this.List.method(.. 。))。
一般来说,我认为在任何情况下从BCL集合类继承都不是一个好主意。我更喜欢将它们作为我班级内部的实现细节。
答案 1 :(得分:2)
您可以在列表上调用“AsReadOnly”方法,该方法应该返回一个IList实例,该实例应该承认它是...错误...只读。
......好吧,我刚看完你的最后一句话,我的不好。在这种情况下,您可能只想实现IList接口或任何朋友,并将大部分接口路由到您保留在内部的列表。然后你可以建立这种行为。即便如此,我也会做类似的模式,提供一些“AsReadOnly”方法,明确地给你一些只读的东西。
答案 2 :(得分:2)
列表与LT; T>根据定义,它是一种可变类型。没有办法让它成为只读。
如果您正在创建派生类,那么您可能应该实现IList< T>直接而不是继承List< T>无论如何。这将使您完全控制实现,允许您在需要时将其设置为只读。