Esto se ha pedido algunas veces aquí en SO, pero mi caso es un poco diferente.Parcelable y Herencia
Tengo la clase A que implementa Parcelable. La clase A contiene algunos datos de miembros que se pueden parcelar. Tiene su propio CREATOR
e implementa writeToParcel()
, describeContents()
, y un constructor que acepta Parcel
.
Hay una clase B que se extiende desde la clase A. La clase B tiene datos de miembro adicionales, pero ninguno de ellos debe parcelarse. Básicamente, los datos parcelables de la clase B son los mismos que los de la clase A. Si trato de poner B en un paquete, pasarlo a otra actividad y volver a leerlo, obtendría una ClassCastException. Supongo que eso es esperado.
Después de un poco de ensayo y error, con el fin de hacer parcelable clase B, que tienen que poner en práctica al menos estas dos cosas:
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);
}
Así que mi preocupación es esto. Hay alrededor de media docena o más clases que se extienden desde A y todas tienen el mismo problema que B. Parece tonto que cada una de ellas tenga que agregar su propia estática CREATOR
y un constructor que acepte Parcel
, solo para volver a pasarla. a A. Todo lo demás es idéntico. Lo único que lo hace diferente es el nombre de la clase. En primer lugar, supera el objetivo de tener herencia.
Por ejemplo, si hay otra clase C que se extiende B, tengo que hacer lo mismo:
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);
}
¿Hay algún tipo de técnicas inteligentes en Java para automatizar este proceso? Tal vez usando genéricos de algún tipo? Si no hay otra manera, también podría eliminar el linaje de herencia y exigir que cada clase implemente Parcelable.
Estoy un poco tarde, pero aquí es la forma en que manejé esto: http://stackoverflow.com/a/20018463/362298 –