4

我有一个有 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 个可以实例化的类

4

4 回答 4

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.
于 2012-12-11T02:59:26.803 回答
1

假设只有一个是非空的,你可以这样做:

Vehicle instance = vehicle.Car ?? vehicle.Train ?? vehicle.Plane;

但是,如果你想对你做任何有用的事情,instance你就必须检查typeof(instance)并将其转换为正确的类..

您可能想考虑只拥有一个属性:

public class Vehicles
{
    public Vehicle VehicleInstance {get; set;}
}

并移动功能,以便您的 WorkOutTransport 方法可以作用于Vehicle实例,而不是关心它具有哪个子类。在类中使用virtualabstract方法,在子类中使用它们。Vehicleoverride

于 2012-12-11T02:59:42.653 回答
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.

于 2012-12-11T03:20:50.617 回答
0

如果您使用不同的属性,则无法避免不检查哪个为空。我建议使用具有标识类型或覆盖ToString方法的属性的基类。

于 2012-12-11T02:57:02.343 回答