【问题标题】:Generic reference to collection对集合的一般引用
【发布时间】:2013-10-15 09:39:01
【问题描述】:

我有两个基类:

class BaseCollection<T> where T : BaseCollectionItem
{

}

class BaseCollectionItem
{

}

这些是基类,后来按以下方式子类化:

class MyCollection : BaseCollection<MyItem>
{

}

class MyItem : BaseCollectionItem
{

}

我想存储对集合的引用,该集合在BaseCollectionItem 中保存一个项目。我该怎么做?

class BaseCollectionItem
{
    private ??? ownerCollection;
}

【问题讨论】:

  • 我对你的最后一句话感到困惑。你要吗???替换为 BaseCollection?
  • 我不认为这是必需的。集合应该引用项目
  • @ItzWarty 我不能。当您将BaseCollectionBaseCollectionItem 子类化时,第一个不再被BaseCollectionItem 特化。相反,它变成了BaseCollection&lt;MyItem&gt;。因此,不幸的是,您的解决方案将不起作用:(
  • @RajeshSubramanian 在我的具体情况下,我实际上需要这些项目来引用拥有它们的集合。否则我不会问这个问题。
  • 为什么不将 MyCollection 的类定义更改为:class MyCollection : BaseCollection

标签: c# generics inheritance collections


【解决方案1】:

如果您希望 BananaCollection(BaseCollection) 始终包含 Bananas,并且您希望 Banana 始终位于 BananaCollection (BaseCollection) 中,那么您有一个循环泛型类型参数的情况。

您可以查看circular generic type parameters 了解更多信息。

【讨论】:

  • 想解释一下 -1 吗?实际上,这是一个很好的解决方案。
【解决方案2】:

看起来你想要你的字段类型的协方差,这不能干净地完成。

您可以尝试使用 Curiously Recurring Generic Pattern 作为described by Eric Lippert here,但要注意问题!

我指的不仅仅是上述文章中描述的问题,还包括一些你自我介绍的问题。例如:为什么不希望将 Giraffe 存储在 BaseCollection&lt;Mammal&gt; 中?

【讨论】:

  • 因为 BaseCollection 有时会实例化它的孩子并且必须准确地知道它包含哪些项目。它是通用的,所以如果我只想保留特定类型的项目,我只需要对其进行子类化,它会负责所有的读写和访问项目。
  • 让我换种说法:为什么你会这样做,以使 BaseCollection&lt;Mammal&gt; 不允许包含在其他哺乳动物中,恰好是 Giraffe 的哺乳动物?
  • 这是结构要求的问题。有十几个不同的集合,每个集合只负责保留一个(密封的,最终的)类。另一方面,每个都派生自基类,每个人都必须知道所包含项目的精确类型。
  • 请注意,这是一个关于 C# 技术方面的问题,而不是关于指定数据结构的要求 :)
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多