这是我的问题。
我有两个类都继承自一个普通的类。 I.E汽车级和厢式车级,都继承了车辆类。我将它们添加到了车型的通用列表中。汽车类具有noofseats属性,并且货车具有权重属性。有没有办法使用foreach循环迭代它们并根据它们是汽车类还是van类输出?
foreach (van v in vehiclelist)
{
lsttest.Items.Add(v.weight;)
}
foreach (car c in vehiclelist)
{
lsttest.Items.Add(c.nofoseats;)
}
我收到错误:'无法将'Test.Car'类型的对象强制转换为'Test.Van'。'
有没有一种简单的方法可以解决这个问题,还是不可能?感谢
答案 0 :(得分:10)
foreach (van v in vehiclelist.OfType<Van>())
{
}
答案 1 :(得分:4)
您需要按类型对其进行过滤,这很简单归功于Linq:
foreach (van v in vehiclelist.Where(x=>x is van))
{
}
答案 2 :(得分:3)
只需检查'是'检查对象是否与给定类型兼容。检查MSDN
foreach (vehicle c in vehiclelist)
{
if(c is car)
{
//do this
}
else
{
//else it should be a van
}
}
答案 3 :(得分:2)
对我来说,多态性的全部意义在于我不关心我的对象究竟是什么基础类型。虽然您可以使用此处已提到的不同方法轻松检查它的类型,但我的答案是根本不这样做。相反,您应该将不同的行为抽象为一个公共函数,而是调用该方法。快速举例:
class Vehicle
{
abstract public int GetMeasurement();
}
class Car : Vehicle
{
//cars are measured in numberOfSeats
override public int GetMeasurement()
{
return numberOfSeats;
}
private int numberOfSeats;
}
class Van: Vehicle
{
//vans are measured by weight
override public int GetMeasurement()
{
return weight;
}
private int weight;
}
foreach (Vehicle v in vehiclelist)
{
//I don't need to do any type checking:
//polymorphism magically gets the right value for me
lsttest.Items.Add(v.GetMeasurement());
}
这样做的好处是,现在我可以在所有地方重复使用相同的方法,而无需关心我真正的类型。现在我可以使用Vehicle做各种很酷的事情(API等):之后,如果我想添加不同的车型,我不需要改变任何东西。我创建了一个新的车辆类型,实现了GetMeasurement()函数,它神奇地起作用。当你开始获得3,5,15种不同的车型时,你可以很容易地看到它的优势。
答案 4 :(得分:0)
static void Main(string[] args)
{
var vehicles = new List<Vehicle>();
vehicles.Add(new Car() { NoOfSeats = 2 });
vehicles.Add(new Car() { NoOfSeats = 4 });
vehicles.Add(new Van() { Weight = 2000 });
vehicles.Add(new Van() { Weight = 3000 });
foreach (var vehicle in vehicles)
{
if (vehicle is Car)
{
Console.WriteLine("I'm a car");
}
if (vehicle is Van)
{
Console.WriteLine("I'm a van");
}
}
Console.ReadKey();
}
class Vehicle
{
}
class Car : Vehicle
{
public int NoOfSeats { get; set; }
}
class Van : Vehicle
{
public int Weight { get; set; }
}
}