我有一个通用集合,它代表一个订单,每个订单项都是“Item”类对象。订单的总价值基于所有订单项的组合值。我目前有一种方法可以在检索到“TotalValue”属性时获取订单的总价值,但我发现这种方法有点不优雅,因为它感觉像是薛定谔的变量;它只会在观察时成为总值。
有什么方法可以让“Item”成员保持在“Quote”集合中,以便在“Item”对象去修改它自己的时候触发包含它的Quote类实例的“updateValue”方法成本价值? item类会自动修改自己的“TotalCost”,但我希望它能够启动链并同时修改订单的总成本/价值。
我试图将其削减以仅保留相关位。
namespace Arbitrary
{
public class Order<T> : IEnumerable<T> where T : Item
{
private List<T> _lines = new List<T>();
private decimal _totalValue;
public decimal TotalValue
{
get { return updateValue(); }
}
private decimal updateValue()
{
_totalValue = 0;
foreach(T Item in _lines)
{
_totalValue += Item.TotalCost;
}
return _totalValue;
}
}
public class Item
{
private decimal _cost;
private int _quantity;
private decimal _totalCost;
public decimal Cost
{
get { return _cost; }
set
{
_cost = value;
_totalCost = (_cost * _quantity);
}
}
public int Quantity
{
get { return _quantity; }
set
{
_quantity = value;
_totalCost = (_cost * _quantity);
}
}
public decimal TotalCost
{
get { return _totalCost; }
}
}
}
答案 0 :(得分:0)
更新:感谢来自Blorgbeard的提示。我切换了&#34; Item&#34;的构造函数。获取Quote集合的对象引用(因为它们在没有Quote集合的情况下永远不会存在)。我更改了&#34; updateValue&#34;内部的方法,以便Item类访问它,因为它们都在同一个程序集中。更新的更改通过&#34; // modified&#34;
进行了评论namespace Arbitrary
{
public class Order<T> : IEnumerable<T> where T : Item
{
private List<T> _lines = new List<T>();
private decimal _totalValue;
public decimal TotalValue
{
get { return updateValue(); }
}
internal decimal updateValue() // modified
{
_totalValue = 0;
foreach(T Item in _lines)
{
_totalValue += Item.TotalCost;
}
return _totalValue;
}
}
public class Item
{
private decimal _cost;
private int _quantity;
private decimal _totalCost;
private Quote<Item> q; // modified
public Item(Quote<Item> q) // modified
{
this.q = q; // modified
}
public decimal Cost
{
get { return _cost; }
set
{
_cost = value;
_totalCost = (_cost * _quantity);
q.updateValue(); // modified
}
}
public int Quantity
{
get { return _quantity; }
set
{
_quantity = value;
_totalCost = (_cost * _quantity);
q.updateValue(); // modified
}
}
public decimal TotalCost
{
get { return _totalCost; }
}
}
}