我目前正在研究一种用于表示二维对象(在网格中)的结构,以便能够根据它们之间的关系来描述和交互对象。目前,它的工作如下:
所以,我的问题是,如何让所有的网格项目相互了解,这就是矩阵的全部目的,在这个集合中,成员们通过位置来了解彼此。我最初的想法是在每个项目中放置一个顶部、底部、左边和右边的邻居,并将其邻居存储在每个成员中。但这不起作用,因为它们是单独的实例,不影响原始对象。我的下一个计划是有一个更新机制,当一个更新的时候,它的邻居都更新他们的定义,当一个网格更新它的邻居时,原始的更新。但这是行不通的,因为它们彼此之间存在无限的更新,并且堆栈溢出。
下一个计划是将MatrixItem的引用传递给它的所有邻居,然后每个条目都可以相互引用。这不起作用,因为我不知道如何使属性成为对另一个对象的引用,而获取和设置该属性将动态地获取或设置另一个对象,该对象将在实例化时定义。
我最后的希望是让所有的孩子都能在矩阵中触发一个方法,但是我需要让孩子们可以使用它。这就是代表的目的吗?如果是的话,我如何在这种情况下执行这些代表?
发布于 2017-05-06 20:03:38
有多种方法可以做到这一点。实际上,您做了几次很好的尝试--例如,您可以将一个属性添加到包含整个矩阵的MatrixItem中--它将自动成为引用,因此,如果您在任何时候更新列表,所有其他项目都将被更新--但您必须确保使用相同的矩阵列表初始化所有项:
//your Matrix list is called matrix
for (var i = 0; i < matrix.MaxLength; i++)
matrix.Add (new MatrixItem (foo, otherProperty, matrix));
另一个可能的解决方案是让每个项目都知道它的邻居是什么--因为邻居也知道他的邻居,所以您可以递归地获得矩阵的所有项:
var lastMatrixItem = new MatrixItem (foo, otherProperty, null, null);
matrix.add (lastMatrixItem);
for (var i = 1; i < matrix.MaxLength; i++)
{
var newMatrixItem = new MatrixItem (foo, otherProperty, lastMatrixItem, null);
lastMatrixItem.followingItem = newMatrixItem;
matrix.Add (newMatrixItem);
lastMatrixItem = newMatrixItem;
}
但如果你不熟悉推荐信的话,这就有点让人困惑了。
实际上,它甚至可以更新MatrixItem的所有矩阵知识,正如您所提到的:
我的下一个计划是有一个更新机制,当一个被更新时,它的邻居都更新它们的定义,当一个网格更新它的邻居时,原始的就会更新。
你只要增加警卫就行了。这意味着,您必须检查分配给属性的值实际上是否与旧值不同,只有在这样的情况下,才需要更新属性。然后,只有当值是新的时,才会调用其他项的更新函数,因此不会导致无限循环。
举个例子:
public class Item
{
private int _id;
public Item Child;
public Item Parent;
public int Id
{
get => _id;
set
{
if (_id == value) //this is the guard
return;
_id = value;
if (Child != null)
Child.Id = _id;
if (Parent != null)
Parent.Id = _id;
}
}
public override string ToString() =>
$"Id: {Id} child: ({Child?.ToString() ?? "-"})";
}
如果保护机制不存在,则会出现StackOverflow异常,因为生成了一个无休止的循环。在以上课程中,这是可能的:
实际上,我在交互中使用了这个类,来演示它。
如果没有卫兵,它就行不通:
(i被标记为错误的原因是,交互在StackOverflow异常之后重新设置自身)
https://stackoverflow.com/questions/43824442
复制相似问题