在Kotlin中实现在接口中声明的属性 [英] Implementing properties declared in interfaces in Kotlin

查看:303
本文介绍了在Kotlin中实现在接口中声明的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Kotlin的新手,所以我有这个界面.

I'm new to Kotlin, so I have this interface.

interface User {
    var nickName : String
}

现在,我想创建一个实现此接口的类PrivateUser.我还必须实现抽象成员nickName.

Now I want to create a class PrivateUser that implements this interface. I have also to implement the abstract member nickName.

通过构造函数非常简单

class PrivateUser(override var nickName: String) : User

但是,当我尝试在类Idea中实现成员时,会为我生成此代码

However when I try to implement member inside the class Idea generates me this code

class Button: User {

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

这让我感到困惑,如何进一步实施它.

It's confusing to me how to implement it further.

推荐答案

必须在Kotlin中初始化属性.在构造函数中声明属性时,将使用传入的内容对其进行初始化.如果在主体中声明该属性,则需要自己定义它(使用默认值或从其他属性中解析).

Properties must be initialized in Kotlin. When you declare the property in the constructor, it gets initialized with whatever you pass in. If you declare it in the body, you need to define it yourself, either with a default value, or parsed from other properties.

一些例子:

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

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

如果您想要一个非默认的getter和/或setter,或者想要一个没有后备字段的属性(当访问时getter和setter会即时计算),则IDEA生成的代码很有用.

The code generated by IDEA is useful if you want a non-default getter and/or setter, or if you want a property without a backing field (it's getter and setter calculate on the fly when accessed).

更多示例:

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

这篇关于在Kotlin中实现在接口中声明的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆