2017-07-18 4 views
2

私は派生型が3つある非抽象基底クラスVehicleを持っています。私はサービスで探しています派生型を単一のメソッドでクローン化する

  • Car
  • Motorcycle
  • Tractor

は、車両タイプのパラメータを受け取り、すべてのためにクローン化されたオブジェクトを返すメソッドCloneVehicleを持っているでしょうVehicleBuilder と呼ばれます3つの派生型。ここで

は私がClonebaseVehicleを再利用したいとクラスはdiferrentのDLLから来ているとコンストラクタを作成することはできません私の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; 
    } 
} 

です。 基本クラス参照を使用して、壊れたオブジェクトをクローンできる他の方法はありますか?

私はあなたの基本クラスからのすべてのメンバーを提供する必要があり-methodあなたCloneBaseVehicleの中でそれに

+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

を抽象メソッドを作成するためにVehicleクラスまたはその派生クラスのいずれかを変更することはできません。多くのメンバーがある場合は、あなたもこれを実行するためにリフレクションを使用することがあります。

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; 
} 

あなたがあなたを選んだ2つのアプローチのどんなにを: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; 
} 

反射ベースのアプローチは、このようになります。既存のCarからTractorを作成すると、当然Carにしか存在しないすべての特別な情報が失われることに注意してください。

関連する問題