扩展数据 class 密封 class kotlin
Extend data class sealed class kotlin
我有一个密封的 class,它有不同的子类型。当我尝试使用 when 子句过滤掉子类型时,我不断收到未解析的引用“名称”
sealed class Fruit(val name: String) {
object APPLE : Fruit(“apple”)
data class BANANA(val isFruit: Boolean) : Fruit(“banana”)
}
internal object Random {
fun build(name: String): FruitNinja{
when(name) {
Fruit.APPLE.name -> {
return AppleFruitNinja()
}
// keep getting error here Unresolved reference: name
Fruit.BANANA.name-> {
return BananaFruitNinja()
}
}
}
}
如何使用“name”参数在 when 子句中进行过滤并构建自定义对象。
你不能使用class
名字访问成员变量,因为Apple
是对象,你可以直接使用.
运算符访问name
但是作为BANANA
是 class,您需要在访问 name
之前创建实例,如
internal object Random {
fun build(name: String): FruitNinja{
when(name) {
Fruit.APPLE.name -> {
return AppleFruitNinja()
}
Fruit.BANANA(true).name -> {
return BananaFruitNinja()
}
}
}
}
正如@rajan.kali 所正确解释的那样,APPLE 是一个对象,因此您可以直接访问名称。但是,BANANA 是一个 class,因此您需要创建一个 class 的实例,否则我建议创建一个伴随对象:
sealed class Fruit(val name: String) {
object APPLE : Fruit("apple")
data class BANANA(val isFruit: Boolean) : Fruit(name) {
companion object {
const val name = "banana"
}
}
}
然后就可以像APPLE一样使用了:
internal object Random {
fun build(name: String): FruitNinja {
when (name) {
Fruit.APPLE.name -> {
return AppleFruitNinja()
}
Fruit.BANANA.name -> {
return BananaFruitNinja()
}
}
}
}
最后一点,build
方法可以用更 kotliny 的方式编写:
internal object Random {
fun build(name: String): FruitNinja = when (name) {
Fruit.APPLE.name -> AppleFruitNinja()
Fruit.BANANA.name -> BananaFruitNinja()
else -> TODO()
}
}
我有一个密封的 class,它有不同的子类型。当我尝试使用 when 子句过滤掉子类型时,我不断收到未解析的引用“名称”
sealed class Fruit(val name: String) {
object APPLE : Fruit(“apple”)
data class BANANA(val isFruit: Boolean) : Fruit(“banana”)
}
internal object Random {
fun build(name: String): FruitNinja{
when(name) {
Fruit.APPLE.name -> {
return AppleFruitNinja()
}
// keep getting error here Unresolved reference: name
Fruit.BANANA.name-> {
return BananaFruitNinja()
}
}
}
}
如何使用“name”参数在 when 子句中进行过滤并构建自定义对象。
你不能使用class
名字访问成员变量,因为Apple
是对象,你可以直接使用.
运算符访问name
但是作为BANANA
是 class,您需要在访问 name
之前创建实例,如
internal object Random {
fun build(name: String): FruitNinja{
when(name) {
Fruit.APPLE.name -> {
return AppleFruitNinja()
}
Fruit.BANANA(true).name -> {
return BananaFruitNinja()
}
}
}
}
正如@rajan.kali 所正确解释的那样,APPLE 是一个对象,因此您可以直接访问名称。但是,BANANA 是一个 class,因此您需要创建一个 class 的实例,否则我建议创建一个伴随对象:
sealed class Fruit(val name: String) {
object APPLE : Fruit("apple")
data class BANANA(val isFruit: Boolean) : Fruit(name) {
companion object {
const val name = "banana"
}
}
}
然后就可以像APPLE一样使用了:
internal object Random {
fun build(name: String): FruitNinja {
when (name) {
Fruit.APPLE.name -> {
return AppleFruitNinja()
}
Fruit.BANANA.name -> {
return BananaFruitNinja()
}
}
}
}
最后一点,build
方法可以用更 kotliny 的方式编写:
internal object Random {
fun build(name: String): FruitNinja = when (name) {
Fruit.APPLE.name -> AppleFruitNinja()
Fruit.BANANA.name -> BananaFruitNinja()
else -> TODO()
}
}