是否可以创建可以添加两个不同类的列表?

时间:2019-04-24 14:31:06

标签: c#

我尝试在arraylist中添加两个类(car和van),但是列表似乎是由第一类(car)定义的,当尝试添加另一个类(van)时,我得到了 runtime错误

  

System.InvalidCastException:'无法转换类型的对象   “ CarBroker.Car”键入“ CarBroker.Van”。

我相信错误是由于在创建类型为“ Car”的第一个条目时定义了arraylist引起的,并且在尝试添加其他类型“范”的错误时发生了。

还有另一个可以代替的列表吗?

public class List // Global ArrayList to store car data
{ public static ArrayList vehicle = new ArrayList(); }
static void Main(string[] args)
{
    Car car = new Car();
    car.SetVehicleData();
    car.SetOwnerData();

    List.vehicle.Add(car);

    Van van = new Van();
    van.SetVehicleData();
    van.SetCompanyData();

    List.vehicle.Add(van);

    Admin a1 = new Admin();
    a1.ListAll();

    Console.ReadKey();

}

当运行我的ListAll()方法时,理想的输出将是类别为“ car”的第一个列表条目,类别为“ van”的第二个条目

相反,我得到了上面提到的错误。

有人可以使用正确的列表或其他功能帮助我吗?我正在参加基本的C#课程,所以我不那么高级:)

2 个答案:

答案 0 :(得分:2)

不要使用ArrayList,而要使用通用List<T>,只要两个类都从同一个基类继承,就可以做到这一点。 多态性。

创建一个新的List<BaseClass>。我们假设CarVan继承自BaseClass。然后

List.Add(Car)
List.Add(Van)

遍历列表时,必须测试对象。例如:

  foreach (Vehicle vehicle in List) 
  { 
        if (vehicle is Car car) 
        { 
            car.customProp 
        } 
        if (vehicle is Van van) 
        { 
           van.VanCustomProp 
        } 
   } 

答案 1 :(得分:1)

要想做您想做的事,您需要在Car和Van之间有一个公共接口;您可以通过基类或接口通过以下两种方式进行操作:

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

public interface IVehicle {
    void SetVehicleData(string data);
    void SetOwnerData(string data);
}

然后您的汽车和货车将继承这些接口:

public class Car : Vehicle, IVehicle {
    public void SetOwnerData(string data) {
        throw new NotImplementedException();
    }

    public void SetVehicleData(string data) {
        throw new NotImplementedException();
    }
}
public class Van : Vehicle, IVehicle {
    public void SetOwnerData(string data) {
        throw new NotImplementedException();
    }

    public void SetVehicleData(string data) {
        throw new NotImplementedException();
    }
}

然后您可以像这样使用它:

        var vehicles = new List<Vehicle>();

        var car = new Car() { Name = "Rover" };
        car.SetOwnerData("data");
        car.SetVehicleData("Rover 75");

        vehicles.Add(car);

        var van = new Van() { Name = "Transit" };
        van.SetOwnerData("data");
        van.SetVehicleData("Transit Van");

        vehicles.Add(van);

如果您的SetOwnerSetVehicle的行为相同,则将此行为放入您的基类中:

public class Vehicle : IVehicle {
    public string Name { get; set; }
    public string OwnerData { get; set; }
    public string VehicleData { get; set; }
    public void SetOwnerData(string data) {
        OwnerData = data;
    }

    public void SetVehicleData(string data) {
        VehicleData = data;
    }
}