为什么对象不能引用父对象和子对象?

Why can't object refer to parent object and child object?

你看,我正面临这个基本问题,我想构建一些节点,其中节点是一个类别,它可以有父类别和它的子类别列表,我只是意识到这在 OOP 中是不可能的,或者我我错了吗?我可以用这样一种方式处理我的情况,即每个对象都只有它的子项列表,但我将不得不(在我看来)不必要地过滤所有类别以找到它的父项,这是问题的基本概念我' m 面对

为什么会这样?

您的所有构造函数都需要在构造当前对象之前构造父子对象。这在您的情况下是不可能的,因为引用形成了一个依赖循环(First -> Fourth -> Third -> Second -> First,因此 First 在创建 First 之后才能完全创建,等等)。

一个解决方案是使 Node 抽象(或接口)并且只在请求时获取值(即在 getter 中):

interface Node {
    val number: Int
    val parent: Node?
    val child: Node?
}

object First : Node {
    override val number = 1
    override val parent get() = Fourth
    override val child get() = Second
}

// Similar for Second, Third, and Fourth

如果您对为什么会出现这种特定的 null 模式感兴趣,请务必记住 Kotlin 中的对象通常在第一次使用时才创建。

  1. 您使用的第一个对象(在 main 中)是 First,因此调用了它的构造函数。
  2. 它的构造函数做的第一件*事情是获取对 Fourth 的引用,后者又执行 Third,后者又执行 Second,后者又尝试执行 First,但是 First 已经在创建过程中,所以它的引用是 null
  3. 然后(我们还在Second)它尝试创建Third(作为child),它正在被创建的过程中,所以它的引用是还有null。此时 Second 已完成,因此以后对它的任何引用都不会是 null.
  4. Third 现在有一个对 Second 的有效引用,并继续尝试创建 Fourth,它仍在创建中,因此 null。现在 Third 完成了。
  5. Fourth 现在有一个对 Third 的有效引用,并移动到 First,它仍在创建中,因此 null。现在 Forth 完成了。
  6. First 现在有一个对 Fourth 的有效引用,并移动到 Second,它已经存在并且有效。现在 First 完成了。

*从技术上讲是第二件事,因为它所做的第一件事是设置数字,但对于本次讨论而言,这是最重要的第一件事。