2016-04-26 113 views
1

我試圖將自定義類型的'數量'添加到int變量'_StoredStock',但我在如何做到這一點上沒有拋出轉換異常的空白。任何幫助,將不勝感激。我已經添加了相關的類,以便您瞭解我正在嘗試做什麼。將自定義類型添加到變量類型int?

class DiscreteStockQuantity : StockQuantity 
{ 
    private int _Quantity; 

    public int Quantity 
    { 
     get { return _Quantity; } 
    } 

    public DiscreteStockQuantity (int quantity) 
    { 
     _Quantity = quantity; 
    } 

} 


    class DiscreteStock : Stock 
{ 
    private int _StoredStock; 
    public int StoredStock 
    { 
     get { return _StoredStock; } 
    } 

    private int _ShelfStock; 
    public int ShelfStock 
    { 
     get { return _ShelfStock; } 
    } 

    private double _WeightPerItem; 
    public double WeightPerItem 
    { 
     get { return _WeightPerItem; } 
    } 

    public DiscreteStock(Line line, double weightPerItem) : base(line) 
    { 
     _ShelfStock = 0; 
     _StoredStock = 0; 
     _WeightPerItem = weightPerItem; 
    } 

    public override void AdjustStock(StockQuantity quantity) 
    { 
     if (quantity is DiscreteStockQuantity) 
     { 

     } 
    } 

abstract class Stock 
{ 

    private Line _Line; 

    public Line Line 
    { 
     get { return _Line; } 
    } 

    public Stock (Line line) 
    { 
     _Line = line; 
    } 

    public abstract void AdjustStock(StockQuantity quantity); 
    public abstract bool Purchase(StockQuantity quantity, out Item item); 
    public abstract void Restock(); 


} 
+1

給出'DiscreteStockQuantity'的代碼 –

+0

在'if'裏面你知道它是DSQ,爲什麼不直接調用返回int值的方法或調用添加int的方法?另一種選擇是重寫DSQ –

+2

@RafałCzabajWTF中的'+'運算符? – leppie

回答

0

這真的,真的感覺就像你在What is the Liskov Substitution Principle?在一個相當主要的方式,這是要給你頭疼的道路侵權。在採取我的建議之前,請花點時間看看你是否在上侵犯了它。如果是這樣,不要採取我的以下建議,,我建議根據你的意識改造你的代碼。

如果你是LSP安全的,但我鼓勵使用接口IStockQuantity。然後你有一個基本的具體的StockQuantity : IStockQuantity和你的新DiscreteStockQuantity : IStockQuantity

......但這真的,真的感覺像一個LSP問題。

1

方法簽名void AdjustStock(StockQuantity quantity)表示任何StockQuantity衍生的類可用於調整庫存。但您只支持使用DiscreteStockQuantity實例進行調整。這就是Nex Terren用LSP提示的內容。如果你願意的話,類型系統應該支持你。

所以:將參數類型更改爲DiscreteStockQuantity

StockQuantity在基類方法聲明中不能更改爲DiscreteStockQuantity,因爲它可能與其他Stock衍生類不同。

因此:如果該方法從未通過基類調用,則刪除基類方法聲明。否則,爲派生類提供足夠的方法來告訴基類庫存數量類型。

abstract class Stock<TStockQuantity> 
    where TStockQuantity : StockQuantity 
{ 
    public abstract void AdjustStock(TStockQuantity quantity); 
} 

class DiscreteStock : Stock<DiscreteStockQuantity> 
{ 
    public override void AdjustStock(DiscreteStockQuantity quantity) 
    { 
     ... 
    } 
} 

現在,不再需要執行AdjustStock中的檢查。

+0

接口的替代方法。雖然我更喜歡界面,但似乎回答了他的問題,所以+1。 –

相關問題