【问题标题】:Defining a class that has a field of the same class. Class with self references?定义具有相同类字段的类。带有自我引用的类?
【发布时间】:2016-06-05 00:59:41
【问题描述】:

您可以定义一个具有该类的成员字段的类,这似乎很奇怪。

public class Person
{
    public string Name { get; set; }
    public Person Spouse { get; set; }
}

现在如果我调用那个类:

var jane = new Person();
var jim = new Person();
jane.Spouse = jim;
jim.Spouse.Spouse = jane;

最后一行导致错误。但是我在想象 jim.Spouse.Spouse 电话在做什么时遇到了一些麻烦。它应该首先评估 jim.spouse 哪个为空,所以它会导致错误,对吗?如果我先断言 jim.Spouse = jane 那么它应该有效吗?但是我基本上是在说 jane.spouse = jane。

如果一个类有一个相同类型的字段,那么它对这个类做了什么?它只是允许类的两个实例有关系吗?类引用自己,所以它是从自己继承的?我有点困惑,也想知道这是否是不好的做法。

【问题讨论】:

  • 如果答案有效,您应该单击复选标记以表明这一点。由于您还没有这样做,请发送Tour 以查看有关 SO 工作原理的一些详细信息。接受和赞成的答案有助于其他人找到好的答案

标签: c# class self-reference


【解决方案1】:

您在这里问了几件事,但一般来说,在对象上引用相同类型(甚至是相同实例)是可以的。

public class Thing {
    private string name;

    public Thing(string name) {
        this.name = name;
    }
    public Thing Other {
        get;
        set;
    }

    public override string ToString() {
        return this.name;
    }
}

var o = new Thing("Foo");
o.Other = o;
Debug.WriteLine(o.Other.Other.Other.Other.ToString()); // Could go on forever
  1. 您对异常的断言是正确的。它抛出是因为jim.Spouse 是一个空引用,所以你不能在它上面设置属性。
  2. 如果你设置jim.Spouse = jane;,那么你应该可以设置一个引用。在这种情况下,您可能想说jim.Spouse.Spouse = jim;,因为jim.Spouse 的计算结果为jane
  3. 对于相同类型的字段,与其他没有什么不同。它只是一个具有类使用的类型的变量。一个类型引用其他相同类型的东西并不少见。例如,一个 Employee 类可能有一个 Manager 的引用,该 Manager 也是一个 Employee。另一个常见的例子是树实现,在二叉树中,一个节点将引用一个左/右子节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多