2

非同期 HTTP ダウンロードを利用するアプリケーションを設計しています。このアプリケーションを Android、Windows デスクトップ、Mac OS デスクトップで動作させたいので、Java で開発し、非常にモジュール化しようとしています。

ここに画像の説明を入力

(わかりやすくするために編集します。使用しているライブラリはAsyncHttpClientAndroid-Async-Httpです)

ダウンロードを処理するためのライブラリは既にありますが、問題は、使用するライブラリに関係なく、CORE モジュールの特定のメソッドがダウンロード機能を実行できる必要があることです。どうしようかと思ったのは2つ。

  • GenericDownloaderアイデア 1: CORE で呼び出される抽象クラスを配置し、特定のアプリで のようなクラスを使用して拡張しますAndroidDownloader
  • アイデア 2: CORE に呼び出されるインターフェイスDownloadInterfaceを配置し、アイデア 1 と同様の方法で特定のアプリに実装します。

これらの両方のアイデアの問題は、抽象クラスまたはインターフェイスをインスタンス化できないことです。その機能を CORE に実装するにはどうすればよいでしょうか?

他にどうすればこの問題を解決できますか?

4

2 に答える 2

0

試み

実際のダウンロードを行う具体的なクラスを (CORE に) 用意します。これは GenericDownloader 抽象クラスではありません。

GenericDownloader クラスには、この具体的なダウンローダーが保護されたメンバーとして含まれます。GenericDownloader クラスは、具体的なダウンローダーがリッスンするために必要なもの (Complete、IOError など) のイベント リスナーになります。これらのリスナー関数を作成する必要があります。あなたの子供はそれらを上書きする必要があるので、それらを保護してください。

ここで、子クラスで、GenericDownloader の「仮想」イベント リスナー関数をオーバーライドし、それらの内部で super.someDowloadEventHandler(...) を呼び出すことを覚えています。これらのオーバーライドに他にあるものはすべて、プラットフォーム固有のコードになります。追加の操作のために、どの子からでも具象ダウンローダーにアクセスできることに注意してください。

抽象クラスをインスタンス化しません。抽象クラスのコンストラクターで具体的なダウンローダーをインスタンス化するだけです。SO、子クラスのコンストラクターで super() を呼び出すことを忘れないでください。

多くの場合、プロジェクトから適切なライブラリを参照し、Android で作業している場合は AndroidDownloader のインスタンスをインスタンス化し、Windows 用の WindowsDownloader などをインスタンス化します。それらのいずれにも、CORE の下位レベルの機能があります。

于 2012-12-05T03:19:31.310 に答える
0

まず第一に、インターフェイスまたは抽象基本クラスを使用するかどうかは、コアがダウンローダの実装に機能を提供できるかどうか、および提供する必要があるかどうかの問題です。できない場合、または使用すべきでない場合は、抽象基本クラスを使用しないでください。抽象基本クラスよりもインターフェイスを優先します。可能な場合でも、実装が使用できる機能を提供するために別のクラスを提供することを検討してください。継承よりもカプセル化を優先します。

あなたの特定の質問に対する答えは、「場合によります」です。一般的に言えば、実行時に利用可能な実装についてコアに伝える何らかの方法が必要です。

ものをパッケージ化する方法によっては、コアにローダー ファクトリ メソッドを配置するのと同じくらい簡単な場合がありClass.forName()ます。これは、分散 JAR ごとに 1 つの実装をパッケージ化することを前提としています。

そうしないと、どこかで構成エントリを使用して実装のクラス名を指定する可能性があります。ここでもリフレクションを使用してクラスを見つけます。

それ以外の場合は、リフレクションを使用してクラスパスを検索し、インターフェイスを実装するクラスを探すことができます。

それ以外の場合は、 を使用java.net.URLClassLoaderしてオンザフライでクラス パスを作成し、それを使用して動的にクラスをロードできます。

于 2012-12-05T04:02:23.210 に答える