Kotlin 按 class 属性 委托所有字段

Kotlin delegate all fields by class property

我有一个包装器 class Manager,它有一个我无法修改的 属性 managerInfo 类型 UserInfo。包装器 class 只是在信息对象周围添加业务规则。在代码中,我需要访问 managerInfo 的属性,每次写 manager.managerInfo.username 有点冗长。

我知道我可以像这样将 属性 委托给这个信息对象:

class Manager {
...
    val username by UserInfo
...
}

然后我可以简单地做 manager.username。但问题是信息 class 有大约 15 个属性,手动执行此操作会很混乱。

有没有办法通过 Kotlin lang 或某些库来委托所有属性?

你可以这样做 implementation by delegation,它看起来像这样:

interface UserCommon {
    val username: String
    val email: String
}

data class UserInfo(
        override var username: String,
        override var email: String
) : UserCommon

class Transaction(
        userInfo: UserInfo
) : UserCommon by userInfo

在那之后 class Transaction 将拥有 UserCommon 拥有的所有属性,但是实现被委托给 userInfo 并传递给构造函数。

另一种方法是将 UserInfo 转换为 MutableMap 并将 属性 调用委托给该映射:

class Transaction(
    userInfoMap: HashMap<String, Any>
) {
    var username: String by userInfoMap
    var email: String by userInfoMap
}