扩展实现Parcelable类(Extending a class that implements

2019-06-25 01:30发布

我有一个类,我们把它叫做A级,实现Parcelable。

我有一个第二类,我们把它叫做B类,扩展类A.

我的问题是:

我怎样写的B类的成员变量的包裹,然后写它的父类的(即:A类的)成员变量的包裹(以及随后的阅读中)?

有一些漂亮的技巧,不需要重写类A的包裹代码? 还是我只需要重写类A的包裹代码,并添加额外的代码B类的成员变量?

Answer 1:

我怎样写的B类的成员变量的包裹,然后写它的父类的(即:A类的)成员变量的包裹

B类覆盖writeToParcel()从A类,链接到父类并且还加入其自己的对象的Parcel

(以及随后的阅读中)?

B类实现public static final Parcelable.Creator<MyParcelable> CREATOR以这样一种方式,它可以让两个班念他们的东西。如果你把创建B类的构造函数,需要一个的方法Parcel作为一个构造函数参数,只链超类构造函数(让A类做它的工作),然后阅读B类的数据。

关键是做他们两个以相同的顺序。 如果你打算让A类读取其数据第一,类必须先写它的数据。

有一些漂亮的技巧,不需要重写类A的包裹代码?

继承和链接到超类。



Answer 2:

这是一个有点复杂,但诀窍是使用反射来获取类型的子类的成员和成员排序,以便您可以读取和写入数据回使用了正确的类型相同的确切顺序。

我已经实现了A级的解决方案在这里: https://github.com/awadalaa/Android-Global-Parcelable

所以现在你可以通过简单的扩展此类做出任何类parcelable。



Answer 3:

添加一个例子,标志着答案确实是正确的,但更多的东西看起来视觉更加适合这样的情况:

这将是晚饭类:

public class BasePojo implements Parcelable {

    private String something;

    //what ever other constructor

    //getters and setters

    protected BasePojo(Parcel in) {
        something = in.readString();
    }

    public static final Creator<BasePojo> CREATOR = new Creator<BasePojo>() {
        @Override
        public BasePojo createFromParcel(Parcel in) {
            return new BasePojo(in);
        }

        @Override
        public BasePojo[] newArray(int size) {
            return new BasePojo[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(something);
    }

}

然后,这将是子类:

public class ChildPojo extends BasePojo implements Parcelable {

    private int somethingElse;

    //what ever other constructor

    //getters and setters

    protected ChildPojo(Parcel in) {
        super(in);
        somethingElse = in.readInt();
    }

    public static final Creator<ChildPojo> CREATOR = new Creator<ChildPojo>() {
        @Override
        public ChildPojo createFromParcel(Parcel in) {
            return new ChildPojo(in);
        }

        @Override
        public ChildPojo[] newArray(int size) {
            return new ChildPojo[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        super.writeToParcel(parcel, i);
        parcel.writeInt(somethingElse);
    }

}

该标记的答案提供了一个很好的解释,称超是关键。



文章来源: Extending a class that implements Parcelable