Исходное и наследование в 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? в обоих из них? Как?)
Ответы
Ответ 1
Вот мое лучшее решение, я был бы рад услышать от кого-то, кто думал об этом.
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();
}
}
Ответ 2
Вот реализация для класса A в реальном мире, поскольку класс B, вероятно, будет иметь более одного объекта с разными типами, отличными от int
Он использует отражение, чтобы получить типы. Затем используется сортировка для сортировки полей, чтобы чтение и запись выполнялись в одном порядке.
https://github.com/awadalaa/Android-Global-Parcelable
Ответ 3
Это мой вариант. Я считаю, что это хорошо, потому что он очень четко показывает симметрию между виртуальными методами чтения и записи.
Боковое замечание: я думаю, что 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();
}
}