2012-05-31 4 views
12

У меня есть класс, мы будем называть его классом A, который реализует Parcelable.Расширение класса, который реализует Parcelable

У меня есть второй класс, мы будем называть его класс B, который расширяет класс А.

Мой вопрос:

Как написать переменные класса Б на земельный участок, а затем записать его родительского класса (т. е.: класс A) на парцеллу (и, впоследствии, прочитать их)?

Есть ли какой-нибудь изящный трюк, чтобы не переписывать код класса А? Или мне просто нужно переписать код Parcel в классе A и добавить дополнительный код для переменных члена класса B?

ответ

19

Как написать переменные класса Б на земельный участок, а затем записать его родительского класса (т.е. класса А в) переменные-члены к Parcel

класса B перекрывает writeToParcel() из класса А, сцепление с суперкласс, а также добавление его собственных объектов к Parcel.

(и, впоследствии, их прочитать)?

Класс B реализует public static final Parcelable.Creator<MyParcelable> CREATOR таким образом, что он может позволить оба класса читал свои вещи. Если вы берете подход создания конструктора по классу B, который принимает Parcel в качестве параметра конструктора, только цепь к конструктор суперкласса (чтобы класс А выполнял свою работу), затем прочитайте данные класса B.

Ключ будет состоять из них в том же порядке. Если вы хотите, чтобы Class A сначала прочитал свои данные, Class A сначала должен записать свои данные.

Есть ли какой-нибудь изящный трюк, чтобы не переписывать код класса А?

Наследование и привязка к суперклассу.

+0

Как я могу назвать конструктор суперкласса? – Andrew

+0

@Andrew: Точно так же, как и в любом Java-классе: 'super (...)' (где '...' - ваш список параметров, если они есть) в качестве первой строки в вашем собственном конструкторе. – CommonsWare

+0

@CommonsWare Хорошо, поэтому я добавил супер (пакет); строка в моем классе B Constructor; как я могу теперь обеспечить, чтобы я назвал суперкласс в письменной форме посылкой? – Jethro

1

Это немного сложный, но трюк заключается в использовании Reflection, чтобы получить типы элементов подкласса и отсортировать элементы, чтобы вы могли читать и записывать данные в том же порядке, используя соответствующие типы.

Я выполнил решение для класса А здесь: https://github.com/awadalaa/Android-Global-Parcelable

так что теперь вы можете сделать любой класс parcelable просто расширить этот класс.

+2

В Android появилась концепция Parcelable, чтобы избежать отражения во время сериализации. Если вы собираетесь размышлять, вы можете просто реализовать интерфейс интерфейса Serializable. –

0

Добавление примера, отмеченный ответ действительно правильно, но что-то более наглядное, кажется, больше подходит для этой ситуации:

Это будет класс ужина:

public class BasePojo implements Parcelable { 

    private String something; 

    //what ever other constructor 

    //getters and setters 

    protected BasePojo(Parcel in) { 
     something = in.readString(); 
    } 

    public static final Creator<BasePojo> CREATOR = new Creator<BasePojo>() { 
     @Override 
     public BasePojo createFromParcel(Parcel in) { 
      return new BasePojo(in); 
     } 

     @Override 
     public BasePojo[] newArray(int size) { 
      return new BasePojo[size]; 
     } 
    }; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(something); 
    } 

} 

И тогда это будет ребенок класс:

public class ChildPojo extends BasePojo implements Parcelable { 

    private int somethingElse; 

    //what ever other constructor 

    //getters and setters 

    protected ChildPojo(Parcel in) { 
     super(in); 
     somethingElse = in.readInt(); 
    } 

    public static final Creator<ChildPojo> CREATOR = new Creator<ChildPojo>() { 
     @Override 
     public ChildPojo createFromParcel(Parcel in) { 
      return new ChildPojo(in); 
     } 

     @Override 
     public ChildPojo[] newArray(int size) { 
      return new ChildPojo[size]; 
     } 
    }; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     super.writeToParcel(parcel, i); 
     parcel.writeInt(somethingElse); 
    } 

} 

Отмеченный ответ дает очень хорошее объяснение, вызов супер - это ключ.

Смежные вопросы