可能是非常愚蠢的Kotlin构造器想法

可能是非常愚蠢的Kotlin构造器想法,kotlin,Kotlin,我意识到这可能是不可能的,我已经下了一个兔子洞,试图从根节点递归地构造一棵树,这导致了我陷入混乱 我删除了所有的绒毛,只是为了说明“问题”的根源(问题很可能是我试图做一些根本没有CS意义的事情) 所以,我有一节课是这样的: class Node(parent: Node?, child: Node?) 我想像这样实例化它(传递“this”-它还没有被实例化为根的子节点的父参数。现在写下它,我意识到它看起来非常愚蠢…但是这在Kotlin中有可能吗 fun exampleFail() {

我意识到这可能是不可能的,我已经下了一个兔子洞,试图从根节点递归地构造一棵树,这导致了我陷入混乱

我删除了所有的绒毛,只是为了说明“问题”的根源(问题很可能是我试图做一些根本没有CS意义的事情)

所以,我有一节课是这样的:

class Node(parent: Node?, child: Node?)
我想像这样实例化它(传递“this”-它还没有被实例化为根的子节点的父参数。现在写下它,我意识到它看起来非常愚蠢…但是这在Kotlin中有可能吗

fun exampleFail() {
    val root = Node(null, Node(root, null)) // Not possible because of compiler
}
编辑:澄清-我完全知道这里的“this”指的是exampleFail所属的类。当我写“this”时,我的意思是“正在构造的节点…”是的,我完全知道这在语法上是不正确的,但我正在尝试找出是否有任何方法来实现这一点


编辑2:将“this”替换为“root”,以更清楚地说明我正在尝试做什么。

技术上我不知道您需要它做什么,但是如果您能够修改
节点
类,那么您可以添加类似这样的解决方法

class Node(parent: Node?, child: Node?, shouldCreateChild: Boolean = false) {
    val child: Node?

    init {
        this.child = child ?: when {
            shouldCreateChild -> Node(this, null)
            else -> null
        }
    }
}

因此在构造函数内部,您可以“看到”正在构造的对象。您甚至可以传入
初始值设定项:Node.(->)Unit
的lambda并造成严重破坏。

技术上我不知道您需要它做什么,但是如果您能够修改
Node
类,那么您可以添加类似这样的解决方法

class Node(parent: Node?, child: Node?, shouldCreateChild: Boolean = false) {
    val child: Node?

    init {
        this.child = child ?: when {
            shouldCreateChild -> Node(this, null)
            else -> null
        }
    }
}

因此,在构造函数中,您可以“看到”正在构造的对象。您甚至可以传入
初始值设定项:Node.()的lambda->Unit
并造成严重破坏。

既然要创建树,为什么第二个参数是指单个子节点的节点?它不应该是可变列表吗?最简单的可复制示例。是的,我正在处理一个树结构,代码比我在这里发布的要深入得多,但是“问题”真的与树无关,我想将正在构造的对象传递给子级的构造函数(我不知道是否有这个名称,但我想它类似于递归构造函数?)。我甚至不知道这是否可能。例如,我正在尝试传递“根”以与根相同的表达式构造子节点构造函数。因此,根此时未定义。免责声明:我不知道kotlin。为什么不将其设为
节点(父节点?=null,子节点?=null)
,然后给节点一个变量(或mTak建议的可变列表)
addChildren
自动绑定父/子关系并像这样使用的方法:val root=
Node().addChildren(Node().addChildren(Node()),Node(),Node())
既然要创建树,为什么第二个参数是指单个子节点的节点?它不应该是可变列表吗?最简单的可复制示例。是的,我正在处理树结构,代码比我在这里发布的要深入得多,但“问题”真的与树无关,我想将正在构造的对象传递给子级的构造函数(我不知道是否有这个名称,但我想它类似于递归构造函数?)。我甚至不知道这是否可能。例如,我正在尝试传递“根”以与根相同的表达式构造子节点构造函数。因此,根此时未定义。免责声明:我不知道kotlin。为什么不将其设为
节点(父节点?=null,子节点?=null)
,然后给节点一个变量(或mTak建议的可变列表)
addChildren
自动绑定父/子关系并像这样使用的方法:val root=
Node().addChildren(Node().addChildren(Node()),Node(),Node())