7

假设我有这个简单的类:

public class Pair {
    public readonly object first;
    public readonly object second;

    public Pair(object first, object second) {
        this.first = first;
        this.second = second;
    }
}

生成对的循环图是不可能的。

你将如何创建一个类似的类,它仍然是不可变的,但可以以某种方式用于生成循环图?

4

3 回答 3

3

有无数种表示图结构的方法。一种这样的方法是使用矩阵。每一行和每一列都由顶点索引,矩阵中的每个单元格代表一条有向(可能是加权)边。一个简单的循环图,0 没有连接边,1 有连接边,就像这样:

| 0 1 |
| 1 0 |

与许多不可变结构一样,构建它们的方式是根据给定矩阵的所需关系返回新结构。例如,如果我们想取上图并将第一个顶点上的一条边添加回自身,则表示它的矩阵就是。

| 1 0 |
| 0 0 |

并将其与另一个矩阵结合起来,我们只需将它们加在一起。

| 0 1 |  +  | 1 0 |  ==  | 1 1 |
| 1 0 |     | 0 0 |      | 1 0 |

当然,有很多方法可以表示矩阵,在速度、空间和某些其他操作方面有不同的权衡,但这是一个不同的问题。

于 2010-10-24T06:44:57.220 回答
0

我会采取一种功能性的方法,将延续传递给 ctor。或者,它可以取而代之的是一系列相似的元素(将 IEnumerable 视为参数)。

于 2011-04-10T18:45:34.240 回答
0

我认为这对于您提出的类型的严格不可变类是不可能的。我唯一能想到的就是添加一个带有设置器的属性,该设置器检查一个字段是否为空,如果是则允许设置它。通过这种方式,您可以将first字段保留在第一个对象null中,并且在循环中创建最后一个对象后,适当地设置该字段以关闭循环。一旦它被设置,它就不再是 null,并且 setter 将不再允许它被改变。当然,该字段仍然可以通过类内部的代码进行更改,但从外部来看,它基本上是不可变的。

像这样的东西(C#):

public class Pair {
    private object first;
    private object second;

    public Pair(object first, object second) {
        this.first = first;
        this.second = second;
    }

    public object First {
        get { return first; }
        set 
        {
            if (first == null)
            {
                first = value;
            }
        }
    }

    // and a similar property for second
}
于 2010-10-24T04:23:01.510 回答