Dies wurde ein paar Mal hier auf SO gefragt, aber mein Fall ist ein bisschen anders.Parcelable und Vererbung
Ich habe Klasse A, die Parcelable implementiert. Klasse A enthält einige Elementdaten, die parzelliert werden können. Es hat seine eigene CREATOR
und implementiert writeToParcel()
, describeContents()
, und einen Konstruktor, der eine Parcel
akzeptiert.
Es gibt Klasse B, die sich von Klasse A erstreckt. Klasse B hat zusätzliche Elementdaten, aber keine davon muss parzelliert werden. Grundsätzlich sind die parzellierbaren Daten der Klasse B mit denen der Klasse A identisch. Wenn ich versuche, B in ein Bündel zu packen, es einer anderen Aktivität zu übergeben und es zurückzulesen, würde ich eine ClassCastException erhalten. Ich denke, das ist zu erwarten.
Nach einem wenig trial-and-error, um Klasse B parcel zu machen, ich habe zumindest diese beiden Dinge zu implementieren:
public static final Parcelable.Creator<B> CREATOR
= new Parcelable.Creator<B>() {
public B createFromParcel(Parcel source) {
return new B(source);
}
public B[] newArray(int size) {
return new B[size];
}
};
public B(Parcel in) throws JSONException {
super(in);
}
Also meine Sorge ist dies. Es gibt ungefähr ein halbes Dutzend oder mehr Klassen, die von A ausgehen und alle das gleiche Problem wie B haben. Es scheint albern, dass jeder von ihnen seine eigene statische CREATOR
und einen Konstruktor hinzufügen muss, der eine Parcel
akzeptiert, nur um sie zurück zu geben zu A. Alles andere ist identisch. Das einzige, was es anders macht, ist der Name der Klasse. Es übertrifft den Zweck, Erbschaft an erster Stelle zu haben.
Zum Beispiel, wenn es eine andere Klasse C ist die B erstreckt, muss ich das gleiche tun:
public static final Parcelable.Creator<C> CREATOR
= new Parcelable.Creator<C>() {
public C createFromParcel(Parcel source) {
return new C(source);
}
public C[] newArray(int size) {
return new C[size];
}
};
public C(Parcel in) throws JSONException {
super(in);
}
Gibt es irgendeine Art von cleveren Techniken in Java, diesen Prozess zu automatisieren? Vielleicht mit generischen irgendeiner Art? Wenn es keinen anderen Weg gibt, kann ich genauso gut die Vererbungslinie entfernen und von jeder Klasse verlangen, dass sie Parcelable selbst implementiert.
Ich bin ein wenig spät, aber hier ist, wie ich diese behandelt: http://stackoverflow.com/a/20018463/362298 –