Посылка и наследование в Android - PullRequest
59 голосов
/ 29 октября 2010

Я получил реализацию 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? В обоих? Как?)

Ответы [ 3 ]

82 голосов
/ 29 октября 2010

Вот мое лучшее решение, я был бы рад услышать от кого-то, кто думал об этом.

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();
    }
}
4 голосов
/ 22 июня 2016

Это мой вариант. Я думаю, что это хорошо, потому что очень четко показывает симметрию между виртуальными методами чтения и записи.

Примечание: я думаю, что 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();
    }
}
1 голос
/ 28 сентября 2013

Вот реализация для класса A в условиях реального мира, поскольку класс B, вероятно, будет иметь более одного объекта с различными типами, отличными от int

. Для получения типов используется отражение.Затем использует функцию сортировки для сортировки полей, чтобы чтение и запись происходили в одном и том же порядке.

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

...