Возможно, очень глупая идея конструктора Kotlin - PullRequest
0 голосов
/ 05 июля 2018

Я понимаю, что это, вероятно, невозможно, я спустился в кроличью нору, пытаясь рекурсивно построить дерево из корневого узла, который привел меня к этому беспорядку ...

Я удалил весь пух, чтобы просто показать корень «проблемы» (где проблема, скорее всего, в том, что я пытаюсь сделать что-то, что просто не имеет никакого смысла в CS).

Итак, у меня есть такой класс:

class Node(parent: Node?, child: Node?)

И я хочу создать его таким образом (передав "this" - который еще не был создан как родительский параметр дочернему узлу корня. Просто записывая это сейчас, я понимаю, что это кажется супер глупым ... но возможно ли это каким-либо образом в Котлине?

fun exampleFail() {
    val root = Node(null, Node(root, null)) // Not possible because of compiler
}

РЕДАКТИРОВАТЬ: Чтобы уточнить - я полностью осознаю, что здесь "this" будет относиться к классу, к которому принадлежит exampleFail. Когда я писал «это», я имел в виду «строящийся узел ...» и да, я полностью осознаю, что это синтаксически неверно, но я пытаюсь выяснить, есть ли способ сделать это.

РЕДАКТИРОВАТЬ 2: Заменить «это» на «корень», чтобы прояснить, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 05 июля 2018

Технически, я не знаю, зачем вам это нужно, но если вы можете изменить класс Node, то вы можете добавить обходной путь вроде этого

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

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

Итак, внутри конструктора вы «видите» объект, который находится в процессе строительства. Вы можете даже передать лямбду initializer: Node.() -> Unit и нанести ущерб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...