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 ステートメントを使用せずにインスタンス化された「車両」をワークアウトし、他のステートメントが null かどうかを確認することです

これは「宿題の質問」ではありません...問題を説明するために単純化しました

実際の車両クラスには、インスタンス化できる 9 つの可能なクラスがあります

4

4 に答える 4

4

デザインを考え直すことをお勧めします。

すべての車両タイプに共通のインターフェースを実装させてから、クラスに。という名前の1つのプロパティをIVehicle持たせてください。VehiclesVehicle

心配するプロパティは1つだけです。

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

1つだけがnull以外になると仮定すると、次のように実行できます。

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

しかし、何か役に立つことをしたい場合は、それinstanceをチェックtypeof(instance)して適切なクラスにキャストする必要があります。

プロパティを1つだけ持つことを検討することをお勧めします。

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

また、機能を移動して、WorkOutTransportメソッドが、Vehicleインスタンスが持つサブクラスを気にする代わりに、インスタンスに作用できるようにします。クラスでvirtualまたはabstractメソッドを使用し、サブクラスでそれらを使用します。Vehicleoverride

于 2012-12-11T02:59:42.653 に答える
0

異なるプロパティを使用する場合、どちらがnullであるかをチェックしないことは避けられません。タイプを識別するプロパティを持つ基本クラスを提案するか、ToStringメソッドをオーバーライドします。

于 2012-12-11T02:57:02.343 に答える
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 に答える