В kotlin, как сделать производный класс от родителя Parcelable (и реализовал вложенный класс Builder)? - PullRequest
0 голосов
/ 11 февраля 2019

Имея базовый класс (который является Parceable), используя шаблон Builder, теперь хотел бы создать дочерний класс, производный от него, чтобы переопределить реализацию функций customFunc_1 и customFunc_2 по умолчанию.

Если простонаследуя базовый класс,

class DerivedDataConfig : BaseDataConfig {
    override open fun customFunc_1(context: Context, savedInstanceState: Bundle?,
                                   onElementClickListener: ElementClickListener? = null) : FrameLayout? {
        // differnt than base
        Log.i("+++", "+++, customFunc_1 called in derived class")
        return android.widget.FrameLayout(context)
    }

    override fun customFunc_2(viewToBind: View, content: IData, position: Int) {
        Log.i("+++", "+++, customFunc_2 called in derived class")
    }
}  

после помещения в пакет и получения getParcelbale из пакета,

bundle.putParcelable(KEY_DATA_CONFIG, derivedDataConfig)
var derivedDataConfig.getParcelable(KEY_DATA_CONFIG)

приведение обратно к базовому классу (потеря реализации переопределенной функции изпроизводный класс)

Как сделать это в kotlin, чтобы вывести из базового класса, который Praceable?

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

Кто-нибудь знает, как это сделать?

open class BaseDataConfig() : Parcelable {
    var param_1 = false
    var param_2 = ArrayList<DataDescriptor>()

    private constructor(parcel: Parcel) : this() {
        param_1 = parcel.readByte() != 0.toByte()
        parcel.readList(param_1, DataDescriptor::class.java.classLoader)
    }

    open fun customFunc_1(context: Context, savedInstanceState: Bundle?,
                          onElementClickListener: ElementClickListener? = null) : FrameLayout? {
        return null
    }

    open fun customFunc_2(viewToBind: View, content: IData, position: Int) {
    }

    class Builder {
        private var param_1 = false
        private var param_2 = ArrayList<DataDescriptor>()
        fun setParam_1(b: Boolean) = apply { this.param_1 = b }
        fun setParam_2(type: String, id: Int) = apply { this.param_2.add(DataDescriptor(type, id)) }
        fun build() : DataConfig {
            return DataConfig().also {
                it.param_1 = param_1
                it.param_1_2 = param_2
            }
        }
    }

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeByte(if (param_1) 1 else 0)
        dest.writeList(param_2)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object {

        @JvmField
        val CREATOR: Parcelable.Creator<DataConfig> = object : Parcelable.Creator<DataConfig> {
            override fun createFromParcel(parcel: Parcel): DataConfig {
                return DataConfig(parcel)
            }

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

}

class DataDescriptor(val type: String, val id: Int)

1 Ответ

0 голосов
/ 11 февраля 2019

Найдите решение для производного от родительского класса Parcelable в здесь скопируйте здесь для ref:

class SavedState extends BaseSavedState {
    int stateToSave;

    SavedState(Parcelable superState) {
      super(superState);
    }

    private SavedState(Parcel in) {
      super(in);
      this.stateToSave = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
      super.writeToParcel(out, flags);
      out.writeInt(this.stateToSave);
    }

    //required field that makes Parcelables from a Parcel
    public static final Parcelable.Creator<SavedState> CREATOR =
        new Parcelable.Creator<SavedState>() {
          public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
          }
          public SavedState[] newArray(int size) {
            return new SavedState[size];
          }
    };
}

И я думаю, что для Builder может потребоваться добавить вложенный класс Builderв производном классе.Или у кого есть способ получше?

...