gpt4 book ai didi

kotlin - 从 Kotlin 中的另一个调用默认构造函数

转载 作者:IT老高 更新时间:2023-10-28 13:41:28 24 4
gpt4 key购买 nike

在 Kotlin 中,当一个类有多个构造函数时,我们如何从另一个构造函数中调用 designated(来自 iOS 世界,我找不到更好的名称)构造函数。

我给你举个例子

final class LoadingButton: LinearLayout {
var text:String? = null

constructor(context: Context, text: String) : this(context) {
this.text = text
}
constructor(context: Context) : super(context) {
val t = this.text
this.view {
button(t) { /* ... */}
}
}
}

在这里,如果我执行 loadingButton("TEST", {}) 该字符串不会传播到按钮,因为 this(context) 在代码内部的代码之前被调用方便构造函数(再次抱歉:)。

这可以在 Kotlin 中解决吗?类似的东西

constructor(context: Context, text: String) {
this.text = text
this(context)
}

编辑

只是为了澄清这个想法,因为它被问到了,这个想法是在一个事件中写这样的东西:

onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

verticalLayout {
loadingButton("Some text")
//or
loadingButton() { this.text = "Some text"}
}

这显然不是很有用,但你明白了。 text 属性可以在构造时或以后知道。

这尤其没用,因为 Kotlin 有参数的默认值,但我正在研究该语言并遇到了这个问题。

编辑 2

另一个澄清是我使用的是 Anko对于布局,loadingButton 方法如下所示:

inline fun ViewManager.loadingButton() = loadingButton {  }
inline fun ViewManager.loadingButton(init: LoadingButton.() -> Unit) = ankoView({ LoadingButton(it) }, init)
inline fun ViewManager.loadingButton(text: String, init: LoadingButton.() -> Unit) = ankoView({ LoadingButton(it, text) }, init)

最佳答案

在 JVM 上不能存在对构造函数进行后调用的代码,因为您必须调用 super(...) 对类本身进行任何操作。把它想象成父类(super class)包含一个私有(private)字段,你必须先初始化它才能使用它。

这通常不是问题,因为您可以反过来调用构造函数:

constructor(context: Context, text: String?) : super(context) {
this.text = text
this.view {
button(text) { /* ... */}
}
}
constructor(context: Context) : this(context, null)
constructor(context: Context, text: String) : this(context, text)

上面的代码与默认参数大致相同:

constructor(context: Context, text: String? = null) : super(context) {
this.text = text
this.view {
button(text) { /* ... */}
}
}

要使这段代码符合习惯(和简洁),请使用 primary 构造函数:

class LoadingButton(context: Context, val text: String? = null): LinearLayout(context) {
init {
this.view {
button(text) { /* ... */}
}
}
}

术语如下:指定-主要,方便-次要

Classes and Inheritance - Kotlin Programming Language了解更多详情。

关于kotlin - 从 Kotlin 中的另一个调用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994258/

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