在下面的示例中,我希望能够将 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)
谢谢你的帮助。
这是完全有可能的,您可以像平常一样添加到列表中,但是要返回需要测试返回的汽车的类型:
// 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)
并确保返回值不为空。
注意:代码未经测试,但应该可以工作。