2017-08-25 15 views
0

私はKotlinを初めて使ったので、私はこのインターフェイスを持っています。Kotlinのインターフェイスで宣言されたプロパティを実装する

interface User { 
    var nickName : String 
} 

ここで、このインターフェイスを実装するクラスPrivateUserを作成します。抽象メンバnickNameを実装する必要があります。コンストラクタを介して

それはそれはさらにそれを実装する方法を私に混乱だ、私はクラスIdea内のメンバーを実装しようとすると、しかし、私は、このコード

class Button: User { 

override var nickName: String 
    get() = TODO("not implemented") 
    set(value) {} 
} 

を生成

class PrivateUser(override var nickName: String) : User 

非常に簡単です。

+0

さて、何を達成しようとしていますか? 'override 'を使うことができます。nickName:String =" hello "' getterとsetterを実装したくないのですか?必要ならば、これらのgetterとsetterの実装を追加するだけです。 –

+0

問題は実装を追加する方法がわかりません。たとえば、setメソッドの '' value''のように、どこに格納すればいいですか? '' nickName''変数に?私は試しましたが、再帰呼び出しのようなものを受け取ります –

+2

それから、前のコメントで私があなたに与えたシンプルなフォームを使用してください。ゲッターとセッターは、別の場所に値を格納したい場合に便利です。または、副作用が必要な場合。 –

答えて

1

プロパティはKotlinで初期化する必要があります。コンストラクタでプロパティを宣言すると、渡されたもので初期化されます。ボディに宣言する場合は、デフォルト値で自分自身を定義するか、他のプロパティから解析する必要があります。

いくつかの例:

class Button : User { 
    override var nickname = "Fred" 
} 

class Button(val firstName: String, val lastName: String) : User { 
    override var nickname = "${firstname[0]}$lastname" 
} 

IDEAによって生成されたコードは、デフォルト以外のゲッターおよび/またはセッターをしたい場合に便利である、またはあなたがバッキングフィールドなしプロパティをしたい場合(これのゲッターとセッターの計算オンザフライでアクセスするとき)。

より多くの例:

class Button : User { 
    override var nickname = "Fred" 
     get() = if (field.isEmpty()) "N/A" else field 
     set(value) { 
      // No Tommy 
      field = if (value == "Tommy") "" else value 
     } 
} 

class Button(val number: Int) : User { 
    var id = "$number" 
     private set 
    override var nickname: String 
     get() { 
      val parts = id.split('-') 
      return if (parts.size > 1) parts[0] else "" 
     } 
     set(value) { 
      field = if (value.isEmpty()) "$number" else "$value-$number" 
     } 
} 
関連する問題