为什么对象不能引用父对象和子对象?
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 中的对象通常在第一次使用时才创建。
- 您使用的第一个对象(在
main
中)是 First
,因此调用了它的构造函数。
- 它的构造函数做的第一件*事情是获取对
Fourth
的引用,后者又执行 Third
,后者又执行 Second
,后者又尝试执行 First
,但是 First
已经在创建过程中,所以它的引用是 null
。
- 然后(我们还在
Second
)它尝试创建Third
(作为child
),它正在被创建的过程中,所以它的引用是还有null
。此时 Second
已完成,因此以后对它的任何引用都不会是 null
.
Third
现在有一个对 Second
的有效引用,并继续尝试创建 Fourth
,它仍在创建中,因此 null
。现在 Third
完成了。
Fourth
现在有一个对 Third
的有效引用,并移动到 First
,它仍在创建中,因此 null
。现在 Forth
完成了。
First
现在有一个对 Fourth
的有效引用,并移动到 Second
,它已经存在并且有效。现在 First
完成了。
*从技术上讲是第二件事,因为它所做的第一件事是设置数字,但对于本次讨论而言,这是最重要的第一件事。
你看,我正面临这个基本问题,我想构建一些节点,其中节点是一个类别,它可以有父类别和它的子类别列表,我只是意识到这在 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 中的对象通常在第一次使用时才创建。
- 您使用的第一个对象(在
main
中)是First
,因此调用了它的构造函数。 - 它的构造函数做的第一件*事情是获取对
Fourth
的引用,后者又执行Third
,后者又执行Second
,后者又尝试执行First
,但是First
已经在创建过程中,所以它的引用是null
。 - 然后(我们还在
Second
)它尝试创建Third
(作为child
),它正在被创建的过程中,所以它的引用是还有null
。此时Second
已完成,因此以后对它的任何引用都不会是null
. Third
现在有一个对Second
的有效引用,并继续尝试创建Fourth
,它仍在创建中,因此null
。现在Third
完成了。Fourth
现在有一个对Third
的有效引用,并移动到First
,它仍在创建中,因此null
。现在Forth
完成了。First
现在有一个对Fourth
的有效引用,并移动到Second
,它已经存在并且有效。现在First
完成了。
*从技术上讲是第二件事,因为它所做的第一件事是设置数字,但对于本次讨论而言,这是最重要的第一件事。