2017-09-26 69 views
-2

不太確定如何用單線解釋它,但這是我的情況。如何在現有類中添加類<T>的通用屬性<T>

我有所謂的「新政」,它有一個屬性它是一類「清單」

的抽象基類現在的交易可以是現金,金融,租賃,批發或租到 - 擁有這就是爲什麼它是交易類型。這也是抽象的,因爲每種交易類型都有一些不適用於其他交易的屬性,但它們都具有一組共享,因此各種交易類型(即金融,租賃等)從基本交易中繼承並具有他們自己添加的方法和屬性。

另一個抽象類「庫存」也是如此。庫存可以是汽車,卡車,小船,房車等),所以我有一類庫存。

這裏的問題:

協約必須包含一個單位庫存。例如,您爲一輛汽車融資或租賃一輛房車,然後您與庫存類型的庫存房產或任何情況下進行交易。

當我創建Deal類並且像SoldUnit一樣向類型Inventory中添加屬性時,T將繼承Deal類。如何在Deal類中創建類型爲Inventory的通用屬性?

由於可能性的數量,交易並不會真正起作用,所以我如何製作一個通用的「SoldUnit」屬性來引用Deal類中的庫存類?同時保持嚴格的打字?我知道我可以用一種對象或動態方式創建一個名爲SoldUnit的屬性,但有沒有更好的方法?

謝謝!

編輯:

對不起,這裏是代碼的摘錄:它不工作,因爲T型已經是一個交易類型,但它的兩個屬性[ret.Vehicle = new Car();ret.SoldUnit = new Car();]我試圖填充在Get()方法中使用特定的庫存類型(汽車,卡車,rv,船等)。特定的庫存類型由數據庫字段中的標誌確定。

再次感謝!

public abstract class Deal<T> 
{ 
    public string Uid { get; set; } = Guid.NewGuid().ToString(); 
    public DealTypes DealType { get; set; } = DealTypes.Finance; 

    public Buyer Customer { get; set; } 
    public Inventory<T> Vehicle { get; set; } 
    public Location Location { get; set; } 
    public Inventory<T> SoldUnit { get; set; } 

    public abstract T Add(string id); 
    public abstract T Update(string id); 
    public abstract T Get(string id); 
} 

public abstract class Inventory<T> 
{ 
    public string Uid { get; internal set; } = Guid.NewGuid().ToString(); 
    public Location Location { get; set; } 
    public string StockNumber { get; set; } = ""; 
} 

public class Cash : Deal<Cash> 
{ 
    public decimal TradeAllowance { get; set; } 
    public decimal TradePayoff { get; set; } 
    public decimal TotalDown { get; set; } 
    public decimal DueOnDelivery { get; set; } 

    public override Cash Get(string id) 
    { 
     var ret = new Cash(); 
     ret.Customer = new Buyer(); 
     ret.Vehicle = new Car(); 
     ret.Location = new Location(); 
     ret.SoldUnit = new Car(); 
    } 
} 

public class Car : Inventory<Car> 
{ 
    public decimal GrossWeight { get; set; } 
    public decimal NetWeight { get; set; } 
    public string Branded { get; set; } = ""; 
    public string FuelType { get; set; } = ""; 
    public string Trim { get; set; } = ""; 
    public string Body { get; set; } = ""; 
    public int Cylinders { get; set; } 
    public decimal EngineSize { get; set; } 
    public string TransmissionType { get; set; } = ""; 
    public string Suspension { get; set; } = ""; 
    public string InteriorColor { get; set; } = ""; 

    public bool OdometerExceedsLimit { get; set; } 
    public bool OdometerTrueMileageUnknown { get; set; } 
    public bool OdometerFiveDigit { get; set; } 


    public string TitleNumber { get; set; } = ""; 
    public DateTime? TitleDate { get; set; } 
    public string TitleState { get; set; } = ""; 
    public DateTime? TitleDue { get; set; } 
    public DateTime? TitleReceived { get; set; } 
} 
+10

有些代碼,即使它不編譯,也能真正幫助說明你的問題。 – CodeCaster

+2

看來你可以聲明抽象類Deal爲'Deal ',並將'T'傳遞給'Inventory ',或者一個'Deal ',並帶有'Inventory '屬性。但是我真的不清楚你想要做什麼。 – CodeCaster

+0

你只是問如何在你的課堂上有多個類型的參數? – David

回答

0

我已經簡化你的代碼下來有點必要的元素,使這項工作,但你需要有一個像分別Deal<D, I> where D : Deal<D, I> where I : Inventory<D, I> & Inventory<D, I> where D : Deal<D, I> where I : Inventory<D, I>定義的基類。然後

您的代碼應該是這樣的:

public abstract class Deal<D, I> where D : Deal<D, I> where I : Inventory<D, I> 
{ 
    public I Vehicle { get; set; } 

    public abstract D Get(string id); 
} 

public abstract class Inventory<D, I> where D : Deal<D, I> where I : Inventory<D, I> 
{ } 

public class Cash : Deal<Cash, Car> 
{ 
    public override Cash Get(string id) 
    { 
     return new Cash() { Vehicle = new Car() }; 
    } 
} 

public class Car : Inventory<Cash, Car> 
{ } 

這就是你需要做的,有一個強類型Vehicle財產和Get(等)的方法是什麼。

+0

謝謝。所以通過這樣做,我需要爲每個可能的組合單獨分類?即 - '公共類現金:新政' '公共類現金:新政' '公共類現金:新政' '公共類現金:新政' ... '公共類車:庫存' '公共類車:庫存<金融,汽車>' '公共類車:庫存' '公共類車:庫存<批發,汽車>' ... 等。 –

相關問題