Kotlin:可分割数据的继承和问题

Gau*_*tam 5 inheritance android parcelable kotlin

我正在尝试解决一个问题,但找不到任何特定的解决方案。

基类

open class FeedBase() : Parcelable{

var type : String =""

constructor(parcel: Parcel) : this() {
    type=parcel.readString()
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(type)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR: Parcelable.Creator<FeedBase> {
    override fun createFromParcel(parcel: Parcel): FeedBase {
        return FeedBase(parcel)
    }

    override fun newArray(size: Int): Array<FeedBase?> {
        return arrayOfNulls(size)
    }
}}
Run Code Online (Sandbox Code Playgroud)

项目类持有数据类并扩展基类

@Parcelize
data class FeedItem(var feed:Feed) : FeedBase()
Run Code Online (Sandbox Code Playgroud)

& 数据类

@Parcelize
data class Feed(var test:String,var score:Int) : Parcelable
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试跨活动发送数据,并且正在创建我的对象,如下所示

val feedItem = FeedItem(Feed("yolo", 1000))
feedItem.type="test"
Run Code Online (Sandbox Code Playgroud)

但我无法获得正确的类型(基类中的 var )。每当我从另一个活动中的可分包意图接收对象时,它就会变空,但项目数据会被保留。我该如何解决这个问题?

Ale*_*nov 0

@Parcelize要求在主构造函数中声明所有序列化属性。

所以它不知道type。在 生成的代码中@Parcelize,基本上有

companion object CREATOR: Parcelable.Creator<FeedItem> {
    override fun createFromParcel(parcel: Parcel): FeedItem{
        val feed = Feed.CREATOR.createFromParcel(parcel)
        return FeedItem(feed)
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意, 的FeedBase实现Parcelable并不重要。如果你想一想,它就不能被使用:如果你有

val feedBase = FeedBase.CREATOR.createFromParcel(parcel)
Run Code Online (Sandbox Code Playgroud)

没有办法把这个FeedBase实例变成一个FeedItem实例。

您需要通过Parceler在伴生对象中实现来为这种情况编写自定义逻辑。