2012-03-19 7 views
0

私はクライアントに呼び出す予定の既存のアプリケーションで使用されるAPIをAndroidで作成しています。多くのクライアントコードがあり、私は本当にそれを変更したくありません。現在、APIはインターフェイスとしてコールバックメソッドを実装しています。たくさんのボイラープレートコードを書くことから自分自身を救うために、私はジェネリックスと拡張可能なクラスを使うことにしました。この設計の決定は、私のAPIのコールバック・インターフェースがジェネリックを使用するようにすることです。これは、コールバックが実装されている型パラメータを指定する必要があるとクライアントにフラグを立てるようになります。クライアントに型パラメータを使用させたくありません。実際には、タイプを指定することからクライアントコードを保護し、クライアントが間違ったタイプを指定しないようにしたいと考えています。ここ一般的なタイプのパラメータを隠す方法コールバックインターフェイスのクラスを実装するから

は一例であり:拡張可能APIクラスの

例の基本的な機能をカプセル化する:BaseAPIを拡張

public abstract class BaseAPI<T> { 
    Callback mCallBack; 

    public BaseAPI(Callback<T> callback) { 
     mCallBack = callback; 
    } 

    public void doSomething() { 
     T response = getResponse(); 
     if (mCallBack != null) { 
     mCallBack.onCallback(response) 
     } 
    } 

    public abstract T getResponse(); 

    public interface Callback<T> { 
     public void onCallback(T response); 
    } 
} 

例クラス:

public class ExampleAPI extends BaseAPI<String> { 

    public ExampleAPI(Callback<String> callback) { 
     super(callback): 
    } 

    public String getResponse() { 
     String response = "blah"; 
     return response; 
    } 
} 

例のクライアントコードは(これはどのように私はそれを見たい):

public class ClientView extends Activity implements Callback { 
    TextView mTextView; 

    onCreate() { 
     //pretend normal setup code is here 

     new ExampleAPI(this).doSomething(); 
    } 

    onCallback(String response) { 
     mTextView.setText(response); 
    } 
} 

例のクライアントコード(これは、コンパイラはそれが見たいです):

public class ClientView extends Activity implements Callback<String> { 
    TextView mTextView; 

    onCreate() { 
     //pretend normal setup code is here 

     new ExampleAPI(this).doSomething(); 
    } 

    onCallback(String response) { 
     mTextView.setText(response); 
    } 
} 

任意のアイデア?これは理にかなっていますか?

+0

コンパイラのメッセージは、警告に過ぎません。今は無視してください。 – EJP

答えて

1

私はあなたが競合する目標を持っているように思えます。解決策は、単純にどこかの別の場所を動かすことです。

interface StringCallback extends Callback<String> 

以上の乱用、あなただけのオブジェクトとそれをマスクすることができます:

interface ObjCallback extends Callback<Object> 

その後ClientViewは、これらのいずれかを実装しStringCallbackなどの中間型隠しインタフェースを実装についてどう

代わりにインターフェースを使用しています。その日の終わりには、基本APIの内容が幸せでなければならず、クライアントコードはジェネリックスを運ぶ必要がありません。

私はあなたがこれをしたい理由を完全にはわかりませんが、クライアントコードは型を指定するだけです。

+0

正直なところ、私はちょっと戻ってクライアントのコードを変更する必要がないので、時間を節約しようとしています。私のプロジェクトは締め切りが非常に厳しいです。 – LowDev1

+1

OPの説明から、現在のクライアントコードが1つのインタフェース名しか使用しておらず、既存の参照を変更したくないと推測しましたか?これについてはどうですか?interface OrigCallbackはCallback を継承します。これにより、クライアントコードは変更されません。 – hopia

関連する問題