@Parcelize注释与继承相结合



我无法使用@parcelize注释创建通用结构togother。我希望构造函数用作 Jason、Room 和 Parcelable 的构造。

假设我们有类

@Parcelize
class Food(var taste: String = "")

现在我想到的两个解决方案

1.抱怨味道必须是var或val,才能有可用的Parceable构造函数

@Parcelize
class FastFood(var callory:String = "", taste: String): Food(taste) // error

2.抱怨我必须明确地卵化物味道 - 那么多态性有什么好处?

@Parcelize
class FastFood(var callory: String = "", var taste: String): Food(taste) // error

如何与你们的库一起使用高效继承?

在 Kotlin 中,如果您在构造函数 'val' 或 'var' 中添加值,它将成为类属性。要使用Parceable,您需要添加它,因为没有它,Parcelable.Creator无法访问它。然后,您需要将"open"修饰符添加到食品类和属性"味道"中,因为在 Kotlin 中默认情况下都是最终的,因此您将能够覆盖口味值。

@Parcelize
open class Food(open val taste: String)
@Parcelize
class FastFood(var callory:String = "", override val taste: String): Food(taste)

我无法使用@Parcelize找到完美的解决方案,但是有两种略有缺陷的方法。

1(使基类抽象,只在子类中使用@Parcelize。这意味着您不能拥有父级的实例,但有时这很好。如果你有能力这样做,这是一个有效的解决方案。

abstract class Food : Parcelable {
    abstract var taste: String
}
@Parcelize
class FastFood(var callory: String = "", override var taste: String = "") : Food()

2(也许你需要能够制作父项的实例。执行此操作的一种方法是使基类不是父类,而是父类和子类的父类。不幸的是,这稍微弄乱了类的层次结构,快餐将不是一种食物,而是两者都是一种基础食物。

abstract class BaseFood : Parcelable {
    abstract var taste: String
}
@Parcelize
class Food(override var taste: String = "") : BaseFood()
@Parcelize
class FastFood(var callory: String = "", override var taste: String = "") : BaseFood()

截至 2021 年 12 月,问题仍然存在,我无法将继承与@Parcelize

一起使用

父类:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
open class Parent (
    var parentString : String
) : Parcelable {
    constructor(): this("")
}

子类(继承父类(

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class Child (
    var childString : String
) : Parent(), Parcelable {
    constructor() : this("")
}

我正在将子类对象从活动 A 发送到活动 B

活动 A 代码:(发件人(

val child = Child()
child.childString = "THIS IS CHILD"
child.parentString = "THIS IS PARENT"
val intent = Intent(this, ActivityB::class.java)
val bundle = Bundle()
bundle.putParcelable("parcel", child)
intent.putExtra("bundle", bundle)
startActivity(intent)

活动 B 代码:(接收方(

val bundle = intent.getBundleExtra("bundle")
val child = bundle?.getParcelable<Child>("parcel") as Child
Log.e("Child Class c", child.childString) //THIS IS CHILD
Log.e("Parent Class p", child.parentString) //"" <- issue

child.parentString = ">,而不是这是父级,这是一个@Parcelize的问题

根据YouTrack问题的建议,我设法使用了一种基于interface声明的解决方法,如下所示:

interface MyInterface {
    val value01: String
    val value02: String
}
@Parcelize
data class Child01(
    override val value01: String,
    override val value02: String
) : MyInterface, Parcelable
@Parcelize
data class Child02(
    override val value01: String,
    override val value02: String
) : MyInterface, Parcelable

最新更新