Android中的可分类和inheritance

我得到了一个Parcelable的实现工作的单一类不涉及inheritance。 我有问题搞清楚实现接口的最佳方式,当它来inheritance。 比方说,我得到这个:

public abstract class A { private int a; protected A(int a) { this.a = a; } } public class B extends A { private int b; public B(int a, int b) { super(a); this.b = b; } } 

问题是,为B实现Parcelable接口的推荐方式(在A?中是如何实现的?)

这是我最好的解决scheme,我很乐意听到有人想到这个问题。

 public abstract class A implements Parcelable { private int a; protected A(int a) { this.a = a; } public void writeToParcel(Parcel out, int flags) { out.writeInt(a); } protected A(Parcel in) { a = in.readInt(); } } public class B extends A { private int b; public B(int a, int b) { super(a); this.b = b; } public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() { public B createFromParcel(Parcel in) { return new B(in); } public B[] newArray(int size) { return new B[size]; } }; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(b); } private B(Parcel in) { super(in); b = in.readInt(); } } 

这里是现实世界中的类A的实现,因为类B可能有多于一个不同于inttypes的对象

它使用reflection来获得types。 然后使用sortingfunction对字段进行sorting,以便读写以相同的顺序进行。

https://github.com/awadalaa/Android-Global-Parcelable

这是我的变种。 我认为这很好,因为它显示了虚拟读取和写入方法之间的对称性。

附注:我认为Google在deviseParcelable界面方面做得很差。

 public abstract class A implements Parcelable { private int a; protected A(int a) { this.a = a; } public void writeToParcel(Parcel out, int flags) { out.writeInt(a); } public void readFromParcel(Parcel in) { a = in.readInt(); } } public class B extends A { private int b; public B(int a, int b) { super(a); this.b = b; } public static final Parcelable.Creator<B> CREATOR = new Parcelable.Creator<B>() { public B createFromParcel(Parcel in) { B b = new B(); b(in); return b; } public B[] newArray(int size) { return new B[size]; } }; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(b); } public void readFromParcel(Parcel in) { super(in); b = in.readInt(); } }