访问基类列表中的派生类对象

时间:2015-02-12 13:45:51

标签: c# list inheritance

说我有3个班级:

class Geometry
{ ... }

class Line : Geometry
{ ... }

class Circle : Geometry
{ ... }

我希望将LineCircle类的所有对象放入一个公共列表中,如下所示:

List<Geometry> list = new List<Geometry>();
Line line = new Line();
Circle circle = new Circle();
list.Add(line);
list.Add(circle);

我的问题是它允许吗?是否仍然可以从列表中检索派生类,如下所示:

Line newLine = (Line)list[0];
Circle newCircle = (Circle)list[1];

如果没有,那么有一种很好的方法可以将所有这些不同类型的对象存储在同一个列表中吗?

3 个答案:

答案 0 :(得分:2)

这个怎么样:

List<Geometry> list = new List<Geometry>(); 
Geometry line = new Line(); 
Geometry circle = new Circle(); 
list.Add(line); 
list.Add(circle);

当获取使用OfType()来获取所需的类型对象时:

List<Line> lines = list.OfType<Line>().ToList(); // get lines
List<Circle> circles = list.OfType<Circle>().ToList(); // get circles

答案 1 :(得分:1)

当然你可以这样存储它们。由于所有对象都有一个共同的基础,Geometry对象,这很好。

然后当您从列表中检索它们时,我建议您使用as运算符,如下所示:

Line newLine = list[0] as Line;

我建议如此,因为正如MSDN中所述:

  

as运算符就像一个强制转换操作。但是,如果转换不是   可能,因为返回null而不是提高   例外。请考虑以下示例:

答案 2 :(得分:1)

是的,自LineCircle Geometry List<Geometry> list = new List<Geometry>() { new Line(), new Circle() }; 允许这样做:

Geometry

如果LineCircle Line newLine = list[0] as Line; // Line instance or null Circle newCircle = list[1] as Circle; // Circle instance or null 等,您检查

Line

要提取所有内容,比如 List<Line> lines = list.OfType<Line>().ToList(); ,请使用Linq:

{{1}}