gpt4 book ai didi

class - 当我们同时使用主构造函数和辅助构造函数时,如何在 kotlin 中初始化类的成员?

转载 作者:行者123 更新时间:2023-12-04 07:19:07 24 4
gpt4 key购买 nike

我是 kotlin 的新手,最近正在学习类(class)。我不明白为什么我会为 _age 变量收到此错误“必须初始化或抽象属性”。虽然我已经在辅助构造函数中对其进行了初始化。

 class Person(firstname:String,lastname:String)
{

var _firstname: String

var _lastname: String
var _age:Int

init{
_firstname=firstname
_lastname=lastname
println("The name of the person is $firstname ")
}
constructor(firstname:String="Jack",lastname:String="Sparrow",age:Int)
:this(firstname,lastname) {
_age=age
println("The age of $_firstname $_lastname is $age")
}
}

最佳答案

这个错误告诉你至少有一种方法可以在不初始化 _age 的情况下构造你的类的实例。属性(property)。
辅助构造函数总是委托(delegate)给主构造函数,而不是相反。这意味着,正如@gidds 指出的那样,如果有人直接调用主构造函数,则属性 _age永远不会有机会被初始化,因此你的错误在这里:

val person = Person("John", "Doe") // what would _age be here?
通常更容易让主构造函数处理您需要的所有状态,并提供具有默认值的参数或辅助构造函数,如果您想要在没有所有信息的情况下构建实例的可选方法。
在您的情况下,您根本不需要辅助构造函数,您应该只需要主构造函数参数的默认值。
此外,您可以对主构造函数使用更短的语法,这样您就可以同时声明其参数并定义类的属性:
class Person(
val firstname: String,
val lastname: String,
val age: Int = 25, // whichever default you want here
) {
init {
println("The name of the person is $firstname")
println("The age of $firstname $lastname is $age")
}
}
以上内容非常紧凑,并定义了以下内容:
  • 带参数的主构造函数 firstname , lastnameage , 其中 age是一个可选参数,默认值
  • 您的类上的 3 个只读属性(因为 val ),它们与主构造函数参数
  • 具有相同的名称

    调用构造函数时,属性会自动使用构造函数参数的值初始化,然后 init block 被执行。
    旁注:
  • 避免var尽可能选择只读val s 代替。对于人类和编译器来说,它们更容易推理,可以进行更好的智能转换和优化
  • 避免 _一般前缀,尤其是在公共(public)属性中(这不是很标准的 Kotlin 风格)
  • 关于class - 当我们同时使用主构造函数和辅助构造函数时,如何在 kotlin 中初始化类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68618767/

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