这似乎是一个很大的问题。我几乎每次都会提出相同的解决方案,但如果人们有更好的方法来实现这一点,那就很好奇。
我有一个类是另一个类的实例列表。父类的状态取决于所有子项的状态
举个例子。说我有以下课程
class Box
{
int _objectId= <insert_unique_id>;
int _itemCount = 0;
public void AddItem()
{
_itemCount = Max(_itemCount + 1, 5);
}
public int GetId()
{
return _objectId;
}
public bool IsFull()
{
return _itemCount == 5
}
}
class BiggerBox
{
Map<int, Box> _boxes;
public void AddToBox(int id)
{
_boxes[id].AddItem();
}
public bool IsFull()
{
foreach(var box in _boxes.Values)
if(!box.IsFull())
return false;
return true;
}
}
“Box”的所有添加都是通过BiggerBox.AddToBox调用完成的。我想要做的是能够确定box.IsFull(),而不是每次添加元素时都迭代每个项目。
通常我通过保留SET或单独收集哪些项目已满而完成此任务。
好奇,有没有人能够找到一个巧妙的解决方案,或者是没有其他办法的简单答案?
答案 0 :(得分:2)
为了达到你想要的目的,你需要做两件事:
例如,如果集合中的对象是可变的(意味着,它们可以在添加到集合后更改),则需要主对象对该更改做出反应。
正如您所说,您可以创建一组单独的已满的对象,但如果对象之后可以更改,则当它们发生更改时,您需要将它们从该集中取出,或者将它们添加到该集合中。
这意味着为了优化这一点,您需要一些方法来观察底层对象的更改,例如,如果它们实现INotifyPropertyChanged或类似的。
如果对象在添加到主对象后无法更改,或者您并不关心它们是否存在,则只需要控制每个入口点,这意味着您基本上需要将必要的检查添加到{{1方法。
对于您的特定类型,我会在AddItem
类上实现一个事件,以便在它满时触发事件。然后,您的Box
类将挂钩此事件,以便观察基础框何时变满。
答案 1 :(得分:1)
您可以维护BiggerBox
类中完整(或非完整)框的数量,并在所有函数中更新它。
,例如,AddToBox
可能是:
bool wasFull = _boxes[id].IsFull;
_boxes[id].AddItem();
if (!wasFull && _boxes[id].IsFull) // After this update box has become full.
completeBoxes += 1;
也可以在其他假设函数中实现此维护程序(例如RemoveFromBox
,AddBox
,RemoveBox
等。