kotlin, как заставить класс, производный от базового класса, производного от parcelable, реализовать сопутствующий CREATOR - PullRequest
0 голосов
/ 15 октября 2019

Имеет BaseClass, полученное из Parcelable, у которого есть компаньон kotlin CREATOR для создания BaseClass из пакета

open class BaseClass() : Parcelable {
...
    companion object {
        @JvmField
        val CREATOR: Parcelable.Creator<BaseClass> = object : Parcelable.Creator<BaseClass> {
            override fun createFromParcel(parcel: Parcel): BassClass {
                return BassClass(parcel)
            }

            override fun newArray(size: Int): Array<BaseCl;ass?> {
                return arrayOfNulls(size)
            }
        }
    }
}

, теперь имеющий DerivedClass производное от BaseClass,

Если забыть добавить свой собственный CREATOR, при восстановлении этого экземпляра DerivedClass будет вызван родительский CREATOR, который не создает экземпляр DerivedClass.

class DerivedClass : BaseClass {
    var stateToSave: Int = 0

    constructor()

    private constructor(parcel: Parcel) : super(parcel) {
        this.stateToSave = parcel.readInt()
    }

    override fun writeToParcel(dest: Parcel, flags: Int) {
        super.writeToParcel(dest, flags)
        dest.writeInt(this.stateToSave)
    }
    /* if forget this it will still compile but will not restore the instance correctly */
    companion object {
        @JvmField
        val CREATOR: Parcelable.Creator<DerivedClass> =
            object : Parcelable.Creator<DerivedClass> {
                override fun createFromParcel(parcel: Parcel): DerivedClass {
                    return DerivedClass(parcel)
                }

                override fun newArray(size: Int): Array<DerivedClass?> {
                    return arrayOfNulls(size)
                }
            }
    }

Есть ли способзаставить DerivedClass реализовать свой собственный CREATOR?

...