覆盖 Kotlin 子类中的变量

Override variable in subclass in Kotlin

我有这个超级class:

abstract class Node(rawId: String) {
    open val id: String
    init {
        id = Base64.toBase64(this.javaClass.simpleName + "_" + rawId)
    }
}

以及扩展节点的这个子class:

data class Vendor (
    override var id: String,
    val name: String,
    val description: String,
    val products: List<Product>?
): Node(id)

当我像这样初始化 Vendor class 时:

new Vendor(vendor.getId(), vendor.getGroup().getName(), description, products);

我可以看到 Node 中的 init 块按预期被触发。但是,当我从 Vendor 对象获取 id 时,它是 rawId 而不是编码后的 Id。

所以我对 Kotlin classes 中的初始化 order/logic 有点困惑。我希望编码代码在所有 subclasses 中通用。有更好的方法吗?

问题是因为您覆盖了子class中的id字段,因此它将始终保持rawId值。

因为基础 class 已经有一个必须是编码值的 id 字段,您不需要在子 class 中覆盖它。您需要在 Vendor class 中将 rawId 提供给 Node class 并让基础 class 处理 id 要实例化的值。您可以将摘要 class 设为

abstract class Node(rawId: String) {
    val id: String = Base64.toBase64(this.javaClass.simpleName + "_" + rawId)
}

然后将你的子class定义为

data class Vendor (
    val rawId: String,
    val name: String,
    val description: String,
    val products: List<Product>?
): Node(rawId)

然后

Vendor newVendor = new Vendor(vendor.getId(), vendor.getGroup().getName(), description, products);
newVendor.getId() // would be the encoded id as you expect

因为 VendorNode 的子class,id 字段也可用于具有编码值的 Vendor 对象。