使用现有父类的值实例化子类

Instantiate child class with values of existing parent class

提问人:Star Shade 88 提问时间:12/15/2022 最后编辑:Star Shade 88 更新时间:12/15/2022 访问量:236

问:

我想将现有父类的值转移到新的子类。如果可能的话,不要反思。 另一个可能的解决方案是,如果我可以将类“强制”到子类。

这是我想要实现的目标的简化示例。

open class Dog {
    var height = -1
}

class Dalmatian: Dog() {
    var dots = -1
}

fun main() {
    val dog: Any = Dog().apply {
        height = 24
    }
    
    // Doesn't work
    val dalmatian = (dog as Dalmatian).apply {
        dots = 101
    }
}
Kotlin 继承 转换

评论

0赞 gidds 12/16/2022
帧挑战:你能阻止它首先创建一个超类(Dog)实例,并直接创建子类(Dalmatian)吗?Dalmatian 是否需要成为 Dog 的子类,或者您可以改用组合或委托(即包装/使用 Dog 实例)?— 正如 Jorn 所展示的那样,没有简单的方法可以做到这一点,我怀疑可能有一种不同的方法会更好。

答:

0赞 Jorn 12/15/2022 #1

没有将类转换为子类型的内置方法。在你的例子中,你可以做一个方法:

class Dog(var height: Int = -1)
class Dalmation(height: Int = -1, var dots: Int = 24): Dog(height) {
  companion object {
    fun fromDog(dog: Dog, dots: Int) = Dalmation(dog.height, dots)
  }
}

然后,您可以转换:

fun main() {
  val dog = Dog()
  val dalmation = Dalmation.fromDog(dog, 24)
}

并且只有当狗已经是斑点狗时,您才能施放:

fun main() {
  val dog: Dog = Dalmatian()
  val dalmatian: Dalmatian = dog as Dalmatian
  
  // but not this
  val dalmatian: Dalmatian = Dog() as Dalmatian
}

评论

0赞 Developer-Mike 12/15/2022
谢谢你的回答。实际的超类有大量的变量,所以你的解决方案实现起来会很痛苦。我想我宁愿去反思。