我尝试在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#课程,所以我不那么高级:)
答案 0 :(得分:2)
不要使用ArrayList
,而要使用通用List<T>
,只要两个类都从同一个基类继承,就可以做到这一点。
多态性。
创建一个新的List<BaseClass>
。我们假设Car
和Van
继承自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);
如果您的SetOwner
和SetVehicle
的行为相同,则将此行为放入您的基类中:
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;
}
}