2017-08-24 14 views
1

私はKotlinを初めて使用しています。私はデータを保持するクラスを作成したいと思います。私は2つのコンストラクタが必要です。私が欲しいのは、このようなものです。Kotlinに2つの異なるコンストラクタを持つデータクラスコンストラクタ

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; 

} 
} 

しかし、セカンダリコンストラクタラインでは、プライマリコンストラクタの呼び出しが必要です。プライマリコンストラクタを呼び出すために必要な委譲があることはわかっています。ここからプライマリコンストラクタを呼び出すことはできません。私はいくつかばかげたミスをしている場合はごめんなさい。私はdocからこの事

答えて

3

に新しいです:

クラスが他の二コンストラクタ(を介して間接的に主要なコンストラクタは、プライマリコンストラクタに委任する必要が 各セカンダリコンストラクタ、直接または を持っている場合s)。 同じクラスの別のコンストラクタへの委任は、このキーワードを使用して行われます:

例:

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の値。

次の2つの二次コンストラクタ持つことができます。

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にアクセスしてみてください。

編集:データクラスには、少なくとも1つのValまたはVARとの主コンストラクタを必要とするため、

これは、データ・クラスでは不可能です。プライマリコンストラクタがある場合は、セカンダリコンストラクタもプライマリコンストラクタに委譲する必要があります。おそらく、すべてのプロパティをデータクラスの単一の主コンストラクタに入れることができますが、null可能なプロパティを持つことができます。または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

関連する問題