将自定义类型添加到变量类型int?

时间:2016-04-26 21:59:43

标签: c#

我正在尝试将自定义类型'quantity'添加到int变量'_StoredStock',但我在如何做到这一点时没有抛出强制转换异常。任何帮助,将不胜感激。我已经添加了相关的课程,这样你就可以了解我正在尝试做什么。

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();


}

2 个答案:

答案 0 :(得分: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内执行检查。

答案 1 :(得分:0)

这真的,真的感觉你是以一种相当重要的方式侵犯What is the Liskov Substitution Principle?,这会让你头疼。在你接受我的建议之前,请花点时间看看你 侵犯了它。如果是这样 不接受我的以下建议, ,我建议根据您的意识重新编写代码。

如果你是LSP安全的,我鼓励使用IStockQuantity的接口。然后你有一个基本的具体StockQuantity : IStockQuantity和你的新DiscreteStockQuantity : IStockQuantity

......但这确实感觉像是一个LSP问题。