2012-12-11 48 views
4

我有9種不同的性質,這中的每一個是一類我怎樣才能得到這類已被傳遞到方法

public class Vehicles 
{ 
    Car car; //class 
    Train train; //class 
    Plane plane; //class 
} 

我通過該車輛目的的方法

例如一個類

var Vehicles = new Vehicles(); 
Vehicles.Car = new Car() 
Object1.WorkOutTransport(vehicle) 

什麼,我需要在Object1做的是「車輛」已經被實例化,而無需使用switch語句和檢查,如果其他人空或不是

鍛鍊

這是不是「功課問題」 ......我已經簡化它來說明問題只

實際車輛類,如果您使用不同的屬性,不檢查,可能被實例化

+1

做'汽車','火車','平面'等有一個共同的父類嗎? – Blorgbeard

+2

我覺得這是一個界面的地方 – Prescott

+0

是有共同的'車輛'父母 – kurasa

回答

0

9類可能這是無效的或無法避免的。我建議使用屬性來標識類型的基類或覆蓋ToString方法。

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. 
+0

如果get/set是沒有任何邏輯背後的公共屬性,則它們應該是變量。 – OverMars

+5

只是好奇,爲什麼他們應該是變數? – Prescott

+3

我同意。 @OverMars你的理由是什麼? –

1

假設只有一個將非空,你可以這樣做:

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

但是,如果你想要做什麼有用的東西與你的instance你是左不必檢查typeof(instance)並鑄造正確的類..

你可能要考慮只有一個屬性:

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

並移動功能,使您的WorkOutTransport方法可以對Vehicle實例執行操作,而不必關心它擁有哪個子類。在Vehicle類中使用virtualabstract方法,在子類中使用override

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 

你有任何其他appoarch除了switch