2017-08-24 189 views
1

我是Kotlin的新手。我想寫一個保存數據的類。我想要兩個構造函數。我想是這樣的在Kotlin中有兩個不同構造函數的數據類構造函數

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; 

} 
} 

但在二級構造線,它說需要主構造函數調用。我知道有些代表團需要在那裏調用主構造器表單。我不能從這裏調用主構造函數。如果我在做一些愚蠢的錯誤,我很抱歉。我是新來這個東西

回答

3

doc

如果類有一個主構造, 需要委託給主構造每個次級構造,無論是直接或 間接通過其他次級構造( S)。代表團 同一類的其他構造函數中使用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就不會被如果使用第二個構造函數初始化,你會得到,如果你一個異常(UninitializedPropertyAccessException)在這種情況下嘗試訪問centerId

編輯:

這不是在數據類可能的,因爲數據類需要與至少一個VAL或變種的主要構造。如果你有主構造函數,那麼你的次構造函數也應該委託給主構造函數。也許你可以在數據類的一個主要構造函數中擁有所有的屬性,但是可以使用空屬性。或者參見Sealed class

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) 
    } 

} 
+0

是的我沒有centerId值在二級構造函數。那就是問題所在。 – FaisalAhmed

+0

更新了答案 – Bob

+0

我可以做與數據類相同嗎? – FaisalAhmed

相關問題