首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >成员-家长意识

成员-家长意识
EN

Stack Overflow用户
提问于 2017-05-06 19:13:58
回答 1查看 26关注 0票数 0

我目前正在研究一种用于表示二维对象(在网格中)的结构,以便能够根据它们之间的关系来描述和交互对象。目前,它的工作如下:

  • 矩阵是集合本身。I由T类型的列表组成,其中包含正在组织的原始数据
  • T型MatrixItem列表,它们是矩阵的成员,存储它们自己的位置以及正在组织的数据
  • 其最大X维和Y维数
  • 它可以包含的最大成员数。
  • 它当前包含的成员数。

所以,我的问题是,如何让所有的网格项目相互了解,这就是矩阵的全部目的,在这个集合中,成员们通过位置来了解彼此。我最初的想法是在每个项目中放置一个顶部、底部、左边和右边的邻居,并将其邻居存储在每个成员中。但这不起作用,因为它们是单独的实例,不影响原始对象。我的下一个计划是有一个更新机制,当一个更新的时候,它的邻居都更新他们的定义,当一个网格更新它的邻居时,原始的更新。但这是行不通的,因为它们彼此之间存在无限的更新,并且堆栈溢出。

下一个计划是将MatrixItem的引用传递给它的所有邻居,然后每个条目都可以相互引用。这不起作用,因为我不知道如何使属性成为对另一个对象的引用,而获取和设置该属性将动态地获取或设置另一个对象,该对象将在实例化时定义。

我最后的希望是让所有的孩子都能在矩阵中触发一个方法,但是我需要让孩子们可以使用它。这就是代表的目的吗?如果是的话,我如何在这种情况下执行这些代表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-06 20:03:38

有多种方法可以做到这一点。实际上,您做了几次很好的尝试--例如,您可以将一个属性添加到包含整个矩阵的MatrixItem中--它将自动成为引用,因此,如果您在任何时候更新列表,所有其他项目都将被更新--但您必须确保使用相同的矩阵列表初始化所有项:

代码语言:javascript
运行
复制
//your Matrix list is called matrix
for (var i = 0; i < matrix.MaxLength; i++)
    matrix.Add (new MatrixItem (foo, otherProperty, matrix));

另一个可能的解决方案是让每个项目都知道它的邻居是什么--因为邻居也知道他的邻居,所以您可以递归地获得矩阵的所有项:

代码语言:javascript
运行
复制
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的所有矩阵知识,正如您所提到的:

我的下一个计划是有一个更新机制,当一个被更新时,它的邻居都更新它们的定义,当一个网格更新它的邻居时,原始的就会更新。

你只要增加警卫就行了。这意味着,您必须检查分配给属性的值实际上是否与旧值不同,只有在这样的情况下,才需要更新属性。然后,只有当值是新的时,才会调用其他项的更新函数,因此不会导致无限循环。

举个例子:

代码语言:javascript
运行
复制
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异常之后重新设置自身)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43824442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档