我有一个有9种不同属性的类,每个属性都是一个类
public class Vehicles
{
Car car; //class
Train train; //class
Plane plane; //class
}
我将此Vehicle对象传递给方法
例如
var Vehicles = new Vehicles();
Vehicles.Car = new Car()
Object1.WorkOutTransport(vehicle)
我在Object1中需要做的是锻炼,“车辆”已经实例化而不使用switch语句并检查其他是否为空
这不是'家庭作业问题'......我已将其简化为仅说明问题
实际车辆类有9个可以实例化的类
答案 0 :(得分:4)
我建议重新考虑你的设计。
为什么不让所有车辆类型都实现公共接口IVehicle
,然后让您的Vehicles
类有一个名为Vehicle
的属性。
您只需要担心一件房产。
public Interface IVehicle
{
... //Properties Common to all vehicles
}
public class Car : IVehicle
{
... //Properties to implement IVehicle
... //Properties specific to Car
}
public class Vehicles
{
public IVehicle Vehicle { get; set; }
}
var vehicles = new Vehicles();
vehicles.Vehicle = new Car();
... //Do whatever else you need to do.
答案 1 :(得分:1)
假设只有一个非null,你可以这样做:
Vehicle instance = vehicle.Car ?? vehicle.Train ?? vehicle.Plane;
但如果您想对instance
做一些有用的事情,则需要检查typeof(instance)
并将其投放到合适的班级。
您可能只想考虑一个属性:
public class Vehicles
{
public Vehicle VehicleInstance {get; set;}
}
并移动功能,以便您的WorkOutTransport方法可以作用于Vehicle
实例,而不是关心它具有哪个子类。使用virtual
类中的abstract
或Vehicle
方法,以及子类中的override
方法。
答案 2 :(得分:0)
如果使用不同的属性,则无法避免检查哪个为null。我建议使用一个基类来识别类型或覆盖ToString
方法。
答案 3 :(得分:0)
您可以强制接口继承者指定其类型:
enum VehicleType
{
Passenger,
Truck,
// Etc...
}
public Interface IVehicle
{
VehicleType Type { get; }
... // Properties Common to all vehicles
}
public sealed class Truck : IVehicle
{
// ... class stuff.
// IVehicle implementation.
public VehicleType Type { get { return VehicleType.Truck; } }
}
这将允许您不要查看每个类,而是要确切知道要播放的类型。
IVehicle vehicle = GetVehicle();
switch (vehicle.Type)
case (VehicleType.Truck)
{
// Do whatever you need with an instance.
Truck truck = (Truck)vehicle;
break;
}
// ... Etc
除了switch
之外,你还有其他任何一个appoarch。