2012-10-09 79 views
5

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.

+0

Estoy un poco tarde, pero aquí es la forma en que manejé esto: http://stackoverflow.com/a/20018463/362298 –

Respuesta

2

Esto es un poco complicado, pero la única manera que puedo pensar de improviso implica la reflexión - siempre que todas las subclases tienen un constructor que toma un Parcel que luego llama super(parcel), podría hacer que el nombre de la clase una parte de la parcela - a continuación, en su método createFromParcel de a:

public A createFromParcel(Parcel source) { 
    Class clazz = Class.forName(source.readString()); 
    Class[1] paramTypes = { Parcel.class }; 
    Constructor ctor = clazz.getConstructor(paramTypes); 
    A myA = (A) ctor.newInstance(source); 
    return myA; 
} 

Tenga en cuenta que esto fue escrito en gran parte fruto de la casualidad y puede necesitar algunos ajustes antes de que funcione (lo sé a ciencia cierta que le falta los controladores de excepciones controladas) - pero esperemos que la idea es claro

-1

He implementado la solución des Cribado por JRaymond y funciona. Es un poco complicado ya que implica un poco de reflexión, pero espero que ayude a alguien más. Ahora cualquier clase que sea parcelable debe extender esta clase GlobalParcelable que implementa parcelable.

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