提问者:小点点

静态编程语言中具有两个不同构造函数的数据类构造函数


我是静态编程语言的新手。我想写一个保存数据的类。我想要两个构造函数。我想要的是这样的东西

 class InstituteSearchDetails (var centerId: String) {


lateinit var centerId: String;
lateinit var instituteName: String;
lateinit var city: String;

init {
    this.centerId=centerId
}
constructor( instituteName: String, city: String)
{
    this.instituteName=instituteName;
    this.city=city;

}
}

但是在辅助构造函数行,它说需要主构造函数调用。我知道需要一些委托来调用那里的主构造函数形式。我不能从这里调用主构造函数。如果我犯了一些愚蠢的错误,我很抱歉。我是新手


共1个答案

匿名用户

从文档:

如果类具有主构造函数,则每个辅助构造函数都需要直接或通过另一个辅助构造函数间接委托给主构造函数。使用this关键字完成对同一类的另一个构造函数的委派:

示例:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

您的代码:

constructor( instituteName: String, city: String) : this("centerId"){
    this.instituteName=instituteName;
    this.city=city;

}

但是看起来您在辅助构造函数中没有centerId值。

您可以有两个辅助构造函数:

class InstituteSearchDetails {

    lateinit var centerId: String;
    lateinit var instituteName: String;
    lateinit var city: String;

    constructor(centerId: String) {
        this.centerId = centerId
    }

    constructor( instituteName: String, city: String)
    {
        this.instituteName=instituteName;
        this.city=city;
    }
}

但是请注意,例如,如果您使用第二个构造函数,centerId就不会被初始化,并且如果您在这种情况下尝试访问centerId,您将得到一个异常(未初始化属性访问异常)。

编辑:

这在数据类中是不可能的,因为数据类需要一个至少有一个val或var的主构造函数。如果你有主构造函数,那么你的辅助构造函数也应该委托给主构造函数。也许你可以在数据类的单个主构造函数中拥有所有属性,但属性可以为空。或者参见密封类

sealed class InstituteSearchDetails {

    data class InstituteWithCenterId(val centerId: String): InstituteSearchDetails()
    data class InstituteWithNameAndCity(val name: String, val city: String): InstituteSearchDetails()

}

fun handleInstitute(instituteSearchDetails: InstituteSearchDetails) {

    when (instituteSearchDetails) {
        is InstituteSearchDetails.InstituteWithCenterId -> println(instituteSearchDetails.centerId)
        is InstituteSearchDetails.InstituteWithNameAndCity -> println(instituteSearchDetails.name)
    }

}