Parcelable и наследование в Android
Я получил реализацию Parcelable, работающую для одного класса, который не включает в себя наследование. У меня есть проблемы с определением лучшего способа реализации интерфейса, когда дело доходит до наследования. Допустим, я получил это:
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; }
}
вопрос в том, какой рекомендуемый способ реализации интерфейса Parcelable для B (в A? в обоих случаях? Как?)
3 ответов:
вот это лучшее мое решение, я был бы рад услышать от кого-то, кто думал об этом.
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(); } }
Это мой вариант. Я думаю, что это хорошо, потому что он очень четко показывает симметрию между виртуальными методами чтения и записи.
Примечание стороны: я думаю, что Google сделал очень плохую работу по разработке интерфейса Parcelable.
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(); } }
вот реализация для класса A в реальной обстановке, так как класс B, вероятно, будет иметь более одного объекта с различными типами, отличными от int
Он использует отражение, чтобы получить типы. Затем использует функцию сортировки для сортировки полей, чтобы чтение и запись происходили в том же порядке.
Comments