【问题标题】:C#: returning an inherited class from an instance of its base class (generic list)C#:从其基类的实例返回一个继承的类(泛型列表)
【发布时间】:2010-09-15 21:38:16
【问题描述】:

这可能是我完全记错了,但我想知道更多关于我做错了什么......

我已经声明一个类只不过是从一个泛型列表的直接继承(这样做是为了简化命名),如下所示:

public class FooList : List<Foo> {}

现在在另一个与此类完全分离的方法中,我试图返回此类的一个实例,但是我想根据标准过滤该类,因此我使用了 lambda 表达式:

var list = new FooList(); // imagine this fills it with different items
var filtered = list.FindAll(c => c.Something == "filter criteria");

现在根据 FindAll 方法,这应该返回一个 List[Foo]。但是,我想将此对象返回为 FooList,而不是 List[Foo]。我是否必须创建 FooList 的新实例并从 List[Foo] 复制项目?

如果是这样,为什么?为什么我不能直接将 List 转换为 FooList,因为它们是同一个对象?

如果可以,我该怎么做?

非常感谢!

【问题讨论】:

  • 我们应该把{} 当作FooList 的字面定义吗?还是您想添加一些成员?

标签: c# inheritance generic-list


【解决方案1】:

您的问题是您使用了错误的工具来完成这项工作。 继承不是简化命名的机制;继承是一种机制,主要用于 (1) 对业务领域对象类之间的“是一种”关系建模,以及 (2) 在相关类型之间实现实现细节的共享和专业化。

如果你想简化命名,那么正确的工具就是把

using FooList = System.Collections.Generic.List<Foo>;

在每个文件的顶部。

【讨论】:

  • 有趣,我以前从未听说过,我会研究一下!最初应该为此添加功能,但我们从未到达那里。我一定会牢记这一点,谢谢!
  • +1 就是这样。 OP 没有必要创建一个继承自 List&lt;Foo&gt;ListFoo 类以使代码更短。 using 解决了根本问题。
【解决方案2】:

它们不是一回事。 FooListList&lt;foo&gt;,但 List&lt;foo&gt;(由从 List&lt;foo&gt; 继承的 FindAll() 函数返回)是不是 FooList。您将需要构建一个新的FooList

您可以为FooList 创建一个构造函数,该构造函数接受IEnumerable&lt;foo&gt; 对象,如下所示:

class FooList : List<foo>
{
   public FooList(IEnumerable<foo> l)
        : base(l)
   {  }
}

或者你也可以这样做:

 var list = new FooList();
 var filtered = list.FindAll(c => c.Something == "filter criteria");
 var newList = new FooList();
 newList.AddRange(filtered);
 return newList;

但是,正如其他一些答案中提到的,如果您不添加任何功能,那么您应该只使用 using 关键字创建一个别名。

【讨论】:

  • 这是关于我的想法的,但对我来说,它似乎应该有效,但我想我确实明白为什么它不起作用。我知道我把它弄反了。有没有办法从 List[Foo] 初始化 FooList 还是我要单独添加每个?顺便说一句,谢谢!
  • 从好的方面来说 List 有一个构造函数重载,它接受一个 IEnumerable 参数,所以创建一个新的 FooList 和复制值应该很容易。
  • @PhilB +1 在我编码的时候打败了我 :)
  • 非常非常酷,我学到了一些新东西!我热爱我的工作 :) 感谢大家的帮助!
【解决方案3】:

不要声明新类FooList。只需使用别名。在源文件的顶部,写:

using FooList = System.Collections.Generic.List<Foo>;

现在你可以在任何地方写FooList,它将被视为与List&lt;Foo&gt;完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2014-12-19
    • 1970-01-01
    相关资源
    最近更新 更多