C#:从其基类的实例(泛型列表)返回一个继承的类

时间:2010-09-15 21:38:16

标签: c# inheritance generic-list

这可能是我完全倒退的事情,但我想知道更多关于我做错的事情......

我已经声明一个类只不过是通用列表的直接继承(为简化命名而做),如下所示:

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,因为它们是同一个对象?

如果可以这样做,我该怎么做?

非常感谢!

3 个答案:

答案 0 :(得分:8)

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

如果您想简化命名,那么适合该工作的工具就是

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

位于每个文件的顶部。

答案 1 :(得分:6)

他们不是一回事。 FooListList<foo>List<foo>FindAll()继承自List<foo>的{​​{1}}函数返回,一个FooList。您需要构建一个新的FooList

您可以为FooList创建一个构造函数,其中包含IEnumerable<foo>这样的对象:

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关键字创建一个别名。

答案 2 :(得分:1)

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

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

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