C# - 保存从同一基类继承的多个对象类型的列表

jam*_*mes 1 c# oop list

在下面的示例中,我希望能够将 StandardCar 或 RaceCar 的实例放入 CarCollection 列表中,然后在循环遍历 CarCollection 列表时将它们转换为正确的数据类型。

我知道这在 C# 中是不可能的。但我找不到一种不涉及在单个类中具有所有属性的类的方法。由于 NumberOfRaces 仅适用于 RaceCars,这样看起来是否很混乱?

当我循环浏览该集合时,我就会知道我正在使用标准汽车还是赛车。但目前,使用下面的代码,如果我将 StandardCar 放入列表中,然后循环该列表并将其转换为 StandardCar,我将得到转换异常。

请注意,我实际的期末课程比下面的要复杂得多。

class Car
{
    public string Name {get; set;}
}

class RaceCar : Car
{
    public int NumberOfRaces {get; set;}
}

class StandardCar: Car
{
    public bool ChildrenInCar {get; set;}
}    

class CarCollection
{
   List<Car> Collection {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

Mat*_*mus 5

这是完全有可能的,您可以像平常一样添加到列表中,但是要返回需要测试返回的汽车的类型:

// Create the cars
RaceCar rcar = new RaceCar();
StandardCar scar = new StandardCar();

// Add to the collection
CarCollection col = new CarCollection();
col.Add(rcar);
col.Add(scar);

// Iterate
foreach(Car car in col.Collection)
{
    if(car is RaceCar)
    {
        RaceCar racecar = (RaceCar)car;
    }
    else if(car is StandardCar)
    {
        StandardCar standCar = (StandardCar)car;
    }

    // ... etc
}
Run Code Online (Sandbox Code Playgroud)

你还可以这样做:

car as RaceCar
Run Code Online (Sandbox Code Playgroud)

并确保返回值不为空。

注意:代码未经测试,但应该可以工作。

  • 具有这样的检查的代码是代码味道,并且是程序设计存在问题的迹象。 (4认同)