代码之家  ›  专栏  ›  技术社区  ›  Filip Frącz

如何覆盖C中的list<t>.isreadOnly#

  •  0
  • Filip Frącz  · 技术社区  · 16 年前

    我试着从列表中派生并选择性地将 唯读 属性打开和关闭。我希望添加/删除/[]函数能够满足这个属性,但它们没有。 正确的方法是什么?

    我的派生类还有一些附加属性,因此很遗憾,我不能将列表包装在readOnlyCollection中。

    3 回复  |  直到 16 年前
        1
  •  7
  •   Reed Copsey    16 年前

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

    您应该让类实现ilist<t>,并有一个私有列表<t>变量。

    您可以传递您希望传递的任何函数,但也可以完全重写它们、更改行为等。这将为您提供完全的控制(代价是拥有许多只调用此.list.method(…)的方法)。

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

        2
  •  2
  •   Levi    16 年前

    根据定义,列表是可变类型。没有办法使它成为只读的。

    如果您正在生成派生类,那么您可能应该直接实现ilist<t>,而不是子类化列表<t>。这将使您能够完全控制实现,并允许您在需要时将其设置为只读。

        3
  •  2
  •   flq    16 年前

    您可以调用列表上的“asreadonly”方法,该方法应返回一个IList实例,该实例应确保它是…err…只读的。

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