1

以下のようなものが.aidlにあり、Androidサービスで使用します。

abstract class sharp implements Parcelable {
}

class rect extends sharp {
}

interface IsharpMgr {
    sharp get();
}

これを行うには、sharpクラスはParcelableを実装する必要があります。rectでwriteToParcelをオーバーライドするのは簡単ですが、「public static finalParcelable.Creator」をシャープで追加するにはどうすればよいですか?

gen / IsharpMgr.javaでは、その作成者はsharp->Creator.createFromParcelを介して呼び出されます。これは静的ファイルであるため、rectでオーバーライドできませんでした。

ありがとう。

4

1 に答える 1

4

編集:私は名前を持っていてsharp混乱していたrectので、混乱を避けるためにそれらを交換しました

次のように実装するだけです。

public static final Parcelable.Creator<Rect> CREATOR
         = new Parcelable.Creator<Rect>() {
     public Rect createFromParcel(Parcel in) {
         return new Rect(in);
     }

     public Rect[] newArray(int size) {
         return new Rect[size];
     }
 };

静的フィールドはオーバーライドできないため、のフィールドはオーバーライドされません。Sharpあなたはフィールドを隠しています。つまり、誰かが次のように書いた場合:

Parcelable.Creator<Rect> creator = Rect.CREATOR;

誰かが書いた場合とは異なるオブジェクトを取得します。

Parcelable.Creator<Sharp> creator = Sharp.CREATOR;

注:Rect私はあなたのクラス名とを大文字にする自由を取りましたSharp。あなたもそれをするべきです。それはあなたの人生を楽にし、あなたのコードはよりJavaのように見えるでしょう;-)

編集:OPのコメントの後にいくつかの追加の説明を追加しました

私はあなたの問題を見ていると思います。オブジェクトを渡すインターフェイスを定義したいのですSharpが、実際には派生Rectオブジェクトを渡したいので、このオブジェクトはSharp受信側でオブジェクトとして再作成されます。AIDLはこの種の継承をサポートしていないようです。しかし、あなたができることは次のようなものです(貧乏人の工場):

Rect

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(getClass().getName());
    // Write other instance variables
}

Sharp

public static final Parcelable.Creator<Sharp> CREATOR
         = new Parcelable.Creator<Sharp>() {
     public Sharp createFromParcel(Parcel in) {
         String derivedClassName = in.readString();
         if (derivedClassName.equals(Rect.class.getName()) {
             // Create an instance of Rect and return that
             return new Rect(in);
         } else if (derivedClassName.equals(...) {
             // Possible other derived classes
         }
     }

     public Sharp[] newArray(int size) {
         return new Sharp[size];
     }
};

コンストラクターに注意してください

public Rect(Parcel in)

着信からすでに削除されているクラス名Stringで呼び出されParcelます。

于 2012-07-24T16:31:15.863 に答える