2016-04-26 98 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。 –

相关问题