2017-07-18 50 views
2

我有一個非抽象基類Vehicle,它有三種派生類型。在單一方法中克隆派生類型

  • Car
  • Motorcycle
  • Tractor

我在看一個服務叫做VehicleBuilder 這將有一個方法CloneVehicle這需要車輛類型的參數,並返回一個克隆的對象爲所有三種派生類型。

這裏是我的CloneVehicle

public Vehicle CloneVehicle (Vehicle v) 
{ 
    var newVehicle = ClonebaseVehicle(v); // Clones all the types in the Base class 
    if(Vehicle.Type == Vehicles.Tractor) 
    { 
     // Clone individual fields 
     var tractor = new Tractor(); 
     tractor = newVehicle as Tractor; 
     tractor.TractorCapacity = 50 ; // tractor is coming null here 
     return tractor; 
    } 
} 

我想重用ClonebaseVehicle和類是從diferrent DLL未來不能創建一個構造函數。 任何其他方式,我可以克隆使用基類引用的dervied對象?

我不能改變Vehicle類或任何其派生類中創建一個抽象的方法,它

+0

爲什麼這個賦值'tractor = newVehicle as Vehicle;''不是'tractor = newVehicle as Tractor;'? –

+1

爲什麼這是如果(Vehicle.Type == Vehicles.Tractor)'不是這個'if(v.Type == Vehicles.Tractor)' –

+0

也相關:https://stackoverflow.com/questions/8631898/c -sharp-inheritance-derived-class-from-base-class – HimBromBeere

回答

3

在您CloneBaseVehicle - 方法,你應該提供從基類的所有成員。如果有很多會員,你也可以使用反射來做到這一點:

Vehicle CloneBaseVehicle(Vehicle v) 
{ 
    Tractor t; 
    switch v.Type 
    { 
     case Vehicles.Tractor: 
      t = new Tractor(); 
     case Vehicles.Car: 
      t = new Car(); 
     case Vehicles.Motorcycle: 
      t = new Motorcycle(); 
    } 

    // now copy the common properties 
    t.MyProperty = v.MyProperty; 
    t.AnotherProperty = v.AnotherProperty; 

    return t; 
} 

public Vehicle CloneVehicle (Vehicle v) 
{ 
    var newVehicl = CloneBaseVehicle(); 

    switch(v.Type) 
    { 
     case(Vehicles.Tractor): 
      var tractor = newVehicle as Tractor; 
      tractor.TractorCapacity = 50 ; 
      break; 
     case Car: 
      ... 
      break; 
    } 
    return newVehicle; 
} 

CloneBaseVehicle基於反射的方法看起來是這樣的:

Vehicle CloneBaseVehicle(Vehicle v) 
{ 
    Tractor t; 
    switch v.Type 
    { 
     case Vehicles.Tractor: 
      t = new Tractor(); 
     case Vehicles.Car: 
      t = new Car(); 
     case Vehicles.Motorcycle: 
      t = new Motorcycle(); 
    } 

    var properties = typeof(Vehicle).GetProperties(); 
    foreach(var p in properties) 
     p.SetValue(t, v.GetValue(p)); 

    return t; 
} 

不管你選擇了你這兩種方法應該知道,當從現有的Car創建Tractor時,當然會丟失僅存在於Car中的所有特殊信息。