首页 > 解决方案 > 如何使用特殊对象列表作为从 C# 中的同一类继承的类型的实例?

问题描述

假设我有从 Vehicle 继承的 Bus 和 Truck 类:

class Vehicle
{
    public string Model { get; set; }
}
class Bus : Vehicle 
{
    public Bus(string model, int passengers)
    {
        Model = model;
        MaxPassengers = passengers;
    }
    public int MaxPassengers { get; set; }
}
class Truck : Vehicle
{
    public Truck(string model, int weight)
    {
        Model = model;
        MaxWeight = weight;
    }
    public int MaxWeight { get; set; }
}

话虽如此,我希望允许用户创建新的卡车或巴士类并希望保存它们。我能想到的最好方法是制作一个列表,但我必须让它同时接受 Truck 和 Bus 对象。

起初我想制作一个车辆清单。这就是我想出的:

class Program
{
    static void Main(string[] args)
    {
        List<Vehicle> allVehicles = new List<Vehicle>();

        Console.Write("[Bus] Insert model: ");
        string busModel = Console.ReadLine();

        Console.Write("[Bus] Insert max passengers: ");
        int busPassengers = Convert.ToInt32(Console.ReadLine());

        Console.Write("[Truck] Insert model: ");
        string truckModel = Console.ReadLine();

        Console.Write("[Truck] Insert weight capacity: ");
        int truckWeight = Convert.ToInt32(Console.ReadLine());

        allVehicles.Add(new Bus(busModel, busPassengers));
        allVehicles.Add(new Truck(truckModel, truckWeight));
    }
}

上面的代码可以编译,但我无法访问它们的特定属性(Bus 对象的 MaxPassengers 和 Truck 对象的 MaxWeight)。铸造似乎也不起作用。以下语句无法编译:

Console.WriteLine((Bus)allVehicles[0].MaxPassengers);

我错过了什么吗?我必须为每个班级列出一份清单吗?

标签: c#listoopinheritancepolymorphism

解决方案


提供的代码一切都很好而且很干净。

您只需要为演员添加括号,否则它会尝试转换MaxPassengers并且失败:

if ( allVehicles[0] is Bus )
  Console.WriteLine(((Bus)allVehicles[0]).MaxPassengers);

显式转换

if ( allVehicles[0] is Bus )
  Console.WriteLine((allVehicles[0] as Bus).MaxPassengers);

空条件运算符也可以用来避免 if:

Console.WriteLine((allVehicles[0] as Bus)?.MaxPassengers);

您还可以在 C# 7+中使用模式匹配:

if ( allVehicles[0] is Bus bus)
  Console.WriteLine(bus.MaxPassengers);

您也可以过滤集合:

using System.Linq;

var allBus = allVehicles.OfType<Bus>();

foreach ( var bus in allBus )
  Console.WriteLine(bus.MaxPassengers);

推荐阅读