我正在尝试将自定义类型'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();
}
答案 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问题。