2016-03-01 53 views
1

我開始了與一個簡單的數據模型:複雜的繼承模式合同

{ 
    "Make" : "Honda", 
    "Model" : "Civic", 
    "Engine" : { 
     "Location" : "Front" 
    } 
} 

這個對象滿足我的使用情況,直到我得到了一個額外的要求,所以就成了:

{ 
    "Make" : "Honda", 
    "Model" : "Civic", 
    "FuelType" : "Gasoline", 
    "Engine" : { 
     "Location" : "Front", 
     "MPG" : 39 
    } 
} 

OR

{ 
    "Make" : "Tesla", 
    "Model" : "Model S", 
    "FuelType" : "Electric", 
    "Engine" : { 
     "Location" : "Back", 
     "Range" : 300 
    } 
} 

現在,我知道我不能覆蓋使用C#派生返回類型,因此後續ING類的結構將無法正常工作:

abstract class Car { abstract Engine Engine; } 

class GasolineCar : Car { override GasolineEngine Engine; } 

class ElectricCar : Car { override ElectricEngine Engine; } 

abstract class Engine { string Location; } 

class GasolineEngine : Engine { int MPG; } 

class ElectricEngine : Engine { int Cells; } 

是否有這個數據模式模型類似的推薦的方式?要求是:

  1. 我可以用JSON.NET
  2. 我可以使用基地車&發動機類型90%的時間,只投它需要特定類型的字段時,容易出現反序列化。

注意:請不要爲上述示例特別提供備用解決方案。我對汽車一無所知,我真正的用例肯定需要使用這種模式或類似的東西。

回答

2

我認爲你絕對會讓你的課程複雜化。爲什麼不能簡單的使用這些類,JSON的可以反序列化到這些類容易

class Car 
{ 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public string FuelType { get; set; } 
    public Engine Engine { get; set; } 
} 

class Engine 
{ 
    public string Location { get; set; } 
    public string MPG { get; set; } 
    public string Range { get; set; } 
} 
+0

此特定場景無關緊要。如果兩種引擎類型具有相同的字段名稱但具有不同的數據類型會怎麼樣? –

+0

不知道我明白你的意思。引擎數據類型?在一天結束時,您需要一個可以映射到json對象的類。 json上的屬性需要映射到類上的屬性。如果json上有一個新的屬性,那麼這個類將會有一個新的屬性。 –

0

一般方法是將這些覆蓋拿到領域不能被重寫。因此,您必須覆蓋您的獲取 - 設置方法

public abstract class Car { public virtual Engine Engine { get; set; } } 

public class GasolineCar : Car { 
    private GasolineEngine _engine; 
    public override Engine Engine { get { return _engine; } set { this._engine = (GasolineEngine)value; } } 
} 

public class ElectricCar : Car 
{ 
    private ElectricEngine _engine; 
    public override Engine Engine { get { return _engine; } set { this._engine = (ElectricEngine)value; } } 
} 
public abstract class Engine { public string Location; } 

public class GasolineEngine : Engine { int MPG; } 

public class ElectricEngine : Engine { int Cells; } 

或者,如果類型限制是最重要的。

public abstract class Car<T> { public virtual T Engine { get; set; } } 

public class GasolineCar : Car<GasolineEngine> {} 

public class ElectricCar : Car<ElectricEngine>{} 
public abstract class Engine { public string Location; } 

public class GasolineEngine : Engine { int MPG; } 

public class ElectricEngine : Engine { int Cells; }