访问基础 classed 列表中的派生 class 对象

Accessing the derived class object inside a base classed list

假设我有 3 个 classes:

class Geometry
{ ... }

class Line : Geometry
{ ... }

class Circle : Geometry
{ ... }

我想把LineCircleclass的所有对象放到一个公共列表中,像这样:

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

我的问题是允许这样做吗?是否仍然可以像这样从列表中检索派生的 class:

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

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

当然可以这样存放。由于您所有的对象都有一个共同的基础,即 Geometry 对象,这很好。

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

Line newLine = list[0] as Line;

我建议这样做,因为正如 MSDN 中所述:

The as operator is like a cast operation. However, if the conversion isn't possible, as returns null instead of raising an exception. Consider the following example:

这个怎么样:

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

是的,这是允许的,因为 LineCircleGeometry:

  List<Geometry> list = new List<Geometry>() {
    new Line(),
    new Circle()
  };

如果 GeometryLineCircle 等,您宁愿 检查

  Line newLine = list[0] as Line;       // Line instance or null
  Circle newCircle = list[1] as Circle; // Circle instance or null

要提取全部,比如说,Line 使用 Linq:

  List<Line> lines = list.OfType<Line>().ToList();