web-dev-qa-db-ja.com

Androidの小包と継承

継承を伴わない単一のクラスで動作する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; }
}

質問は、BのParcelableインターフェースを実装するための推奨される方法です(Aで?両方で?どうですか?)。

60

ここに私の最善の解決策があります。それについて考えていた誰かから聞いてうれしいです。

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();
    }
}
82

これは私のバリアントです。これは、仮想の読み取りメソッドと書き込みメソッドの対称性を非常に明確に示しているため、素晴らしいと思います。

サイドノート: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();
    }
}
4
osxdirk

クラスBはint以外の異なるタイプのオブジェクトを複数持つ可能性が高いため、実際の環境でのクラスAの実装を次に示します。

リフレクションを使用して型を取得します。次に、ソート関数を使用してフィールドをソートし、読み取りと書き込みが同じ順序で行われるようにします。

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

1
Alaa Awad