覆盖 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
因为 Vendor
是 Node
的子class,id
字段也可用于具有编码值的 Vendor
对象。
我有这个超级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
因为 Vendor
是 Node
的子class,id
字段也可用于具有编码值的 Vendor
对象。