gpt4 book ai didi

kotlin - 如何将 Kotlin 默认属性值设置为 `this`

转载 作者:行者123 更新时间:2023-12-02 13:06:41 25 4
gpt4 key购买 nike

我有以下代表简单树的类结构。每个项目可以有多个 child 和 parent 。

不过,树根让我头疼。我试图在不使用 null 的情况下做到这一点所以我可以通过调用 item.parent 向上遍历树.为了简化它,我希望根以自己为父,但我不知道该怎么做。

interface Item {
val parent: Directory
}

interface ItemWithChildren{
val children: MutableList<Item>
}

class Directory() : Item, ItemWithChildren {
override val children: MutableList<Item> = mutableListOf()
override val parent: Directory by lazy { this }

constructor(par: Directory) : this() {
parent = par //Error: val cannot be reassigned
}
}

class File(override val parent: Directory) : Item

该代码无法编译,因为无法重新分配 val parent .但是使用 this作为默认参数值也是不可能的。有什么出路吗?

如果我允许父级可以为空,那么解决方案很简单。但如果可能的话,我不想使用空值。还有 null会打败 item.parent链。

最佳答案

您可以使用 init堵塞。例如。:

class Directory(parent: Directory? = null) : Item, ItemWithChildren {
override val children: MutableList<Item> = mutableListOf()
override val parent: Directory

init {
this.parent = parent ?: this
}
}

或者,您可以为“root”创建一个单独的“父”实现。例如。:
interface ChildItem /* renamed from `Item` for clarity */ {
val parent: ParentItem
}

interface ParentItem /* renamed from `ItemWithChildren` for clarity */ {
val children: MutableList<ChildItem>
}

class Root() : ParentItem {
override val children: MutableList<ChildItem> = mutableListOf()
}

class Directory(override val parent: ParentItem) : ChildItem, ParentItem {
override val children: MutableList<ChildItem> = mutableListOf()
}

class File(override val parent: ParentItem) : ChildItem

这样你的“根”项目就没有 parent类似于您的“叶子”("file")项目没有 children 的属性属性(property)。您可能还想让您的 ChildItemParentItem接口(interface)扩展了一个通用接口(interface)(例如,名为 Item )。

关于kotlin - 如何将 Kotlin 默认属性值设置为 `this`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39663976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com