【问题标题】:Inheriting from List<T> in .NET (vb or C#)从 .NET(vb 或 C#)中的 List<T> 继承
【发布时间】:2011-07-09 14:40:49
【问题描述】:

我已经在 C++ 世界中钻研了一段时间,但现在我又进入了 .NET 世界,VB 和 C#,我想知道你是否有一个代表某物集合的类,并且你希望能够使用这在 foreach 循环等中......是自己实现 IEnumerableIEnumerator 更好,还是应该从 List&lt;T&gt; 继承,其中 T 是单数形式的对象类型?

例如,我知道在 C++ 中,从容器继承被认为是一个坏主意。

但是.NET 呢。

编辑:

看来我的问题有点被误解了。我对 .NET 中的现有集合一点也不满意。这是我的问题,我有一个名为“Person”的类,我需要一个名为“Scouts”的集合,我想要一个名为“Scouts”的类,此时我希望能够编写

foreach Person in Scouts ...

将这个 Scouts 作为 People 集合并能够在 foreach 循环中使用它的最佳方法是什么?

【问题讨论】:

  • Scouts 将是变量属性的名称,而不是类型。因此,你完全可以声明public List&lt;Person&gt; Scouts { get; set; },然后去foreach( var person in Scouts ) ...
  • 另外,作为旁注,请注意,当您更新原始帖子时,没有人会收到通知。因此,通常没有人会回复您的更新。

标签: .net inheritance collections


【解决方案1】:

你说:

我有一个名为“Person”的类,我 需要一个名为“Scouts”的集合, 我想在一个名为 '童子军',在这一点上我想成为 会写

foreach Person in Scouts ...

如果我理解正确,你想要:

class Scouts : IEnumerable<Person>
{
    private List<Person> scouts;

    public IEnumerator<Person> GetEnumerator()
    {
        return scouts.GetEnumerator();
    }
}

【讨论】:

  • 不明白为什么 List 童子军不起作用
  • @Asher:我知道Scouts 类将包含更多信息,而不仅仅是列表。否则,你是对的:只需一个 List&lt;Person&gt; Scouts 就可以了。
【解决方案2】:

在 .NET 中实现 IEnumerable&lt;T&gt; 或派生自 List&lt;T&gt; 的情况很少见。如果你需要一个带有索引器的动态长度集合,你可以直接使用List&lt;T&gt;,如果你需要一个固定长度的集合,你可以使用一个数组T[]System.Collections.Generic 命名空间包含大部分通用集合类。

【讨论】:

  • 同意,必须实现自己的集合类型是罕见的。为大多数目的而构建的内置集合类型如此之多,您不应该需要担心它。此外,如果您确实有自己的集合类型,它可能由您可以委托给的内置支持。我认为这个问题在这一点上纯粹是理论上的。
【解决方案3】:

真正的问题是,您为什么要实现自己的“某物集合”?也就是说,您究竟为什么对现有的收藏不满意?

一旦你回答了这个问题(并且仍然确定你想这样做),你最好从 System.Collections.ObjectModel 命名空间中的集合之一继承 - 即 Collection&lt;T&gt;KeyedCollection&lt;T&gt; 或 @ 987654324@,取决于您的特定需求。

【讨论】:

    【解决方案4】:

    托尼,像往常一样“视情况而定”。 IEnumerable 和 IList 之间的基本区别在于对 IList 进行添加和排序的能力。

    正如 Darin 所说,直接使用类而不是实现接口更为常见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多