【发布时间】:2009-04-22 19:40:31
【问题描述】:
我正在尝试从 List 派生并有选择地打开和关闭 IsReadOnly 属性。我希望 Add/Remove/[] 函数会尊重这个属性,但他们没有。 这样做的正确方法是什么?
我的派生类有一些额外的属性,所以很遗憾我不能将列表包装在 ReadOnlyCollection 中。
【问题讨论】:
标签: c# properties overriding readonly
我正在尝试从 List 派生并有选择地打开和关闭 IsReadOnly 属性。我希望 Add/Remove/[] 函数会尊重这个属性,但他们没有。 这样做的正确方法是什么?
我的派生类有一些额外的属性,所以很遗憾我不能将列表包装在 ReadOnlyCollection 中。
【问题讨论】:
标签: c# properties overriding readonly
在这种情况下使用封装而不是继承。
你应该让你的类实现 IList
你可以通过任何你想要的函数,也可以完全覆盖它们,改变行为等。这给了你完全的控制权(代价是有很多方法除了调用 this.List.method(.. .) ).
总的来说,我认为在任何情况下从 BCL 集合类继承都不是一个好主意。我更喜欢让它们成为我班级内部的实现细节。
【讨论】:
List
如果您正在创建派生类,您可能应该直接实现 IList
【讨论】:
您可以调用 list 上的“AsReadOnly”方法,该方法应该返回一个 IList 实例,该实例应该承认它是...错误...只读。
...好吧,我刚刚看了你的最后一句话,我的错。在这种情况下,您可能只想实现 IList 接口或任何朋友,并将大部分接口路由到您在内部保留的列表。然后你可以建立这种行为。即便如此,我也会做一个类似的模式,提供一些“AsReadOnly”方法,显式地给你一些只读的东西。
【讨论】: