これはAndroid固有です。
Androidのすべてのアクティビティは、アプリケーションのすべてのレイアウトで使用される一般的なコード、特にレイアウトをレイアウトに挿入するいくつかの一般的なsetContentView()オーバーライドコードを配置するためのすてきでクリーンな場所を提供するカスタムクラスから派生しています。したがって、典型的な階層は次のようになります。
MyActivity extends MyBaseClass -> MyBaseClass extends Activity -> Activity
私のアプリの1つには、Googleマップのサポートが必要でした。そこで、MyBaseClassをテンプレート/ジェネリックに変換して、次のようなことができるようにしました。
MyActivity extends MyBaseClass<MapActivity> -> MyBaseClass<T> extends T -> T
もちろん、Javaテンプレート/ジェネリックは、試行直後に発見したC ++テンプレートほど有用ではないため、コンパイルに失敗しました。そのため、一時的な回避策として、まったく別のクラスを作成することになりました。
MyActivity extends MyBaseMapClass -> MyBaseMapClass extends MapActivity -> MapActivity
そして、すべてのコードをMyBaseClassからMyBaseMapClassにコピーしました。インポートに関連するいくつかの小さな変更を除いて、コードは同じです。それは機能しますが、それはほとんど良い解決策ではありません。
私は、上記が問題の終わりであり、二度とそれを再検討する必要がないだろうと指を交差させました。
残念ながら、私ははるかに複雑な基本クラスを使用したフラグメントとアクティビティの組み合わせを実験し始めており、上記のコード重複の問題は深刻な問題になりつつあります。1つのファイルに変更を加えるときはいつでも、それを他のファイルに複製することを忘れないでください。開発は十分に速く進んでいるため、すぐに同期がとれなくなります。
Activity、MapActivity、FragmentActivity、ListActivity、PreferenceActivityなど。使用するクラスごとに個別の派生クラスを作成する必要がありますか?私はそうしないことを望みます、そしてこの理由で、私はすでに私の派生を最初に制限しました(私の活動のいくつかは結果として特定の機能を持っていません)。この問題は、2つの別々の基本クラスを使用することがあるという事実によってさらに悪化します(一部のアクティビティではさらに多くのビューをレイアウトに拡張する必要がありますが、すべてのアクティビティで拡張する必要はありません)。
MyActivity extends MyBaseClass -> MyBaseClass extends Activity -> Activity
MyActivity2 extends AnotherBaseClass -> AnotherBaseClass extends MyBaseClass -> MyBaseClass extends Activity -> Activity
マップでAnotherBaseClassのコードを使用する場合は、MyBaseMapClassだけでなく、AnotherBaseMapClassも作成してコードをコピーする必要があります。この時点で私は最大4つのクラスになり、そのうちの2つは数千行の複製されたコードです。複製されたコードは、メンテナンスと開発を非常に困難にするため、私を悩ませます。
Androidクラスを派生させると、Activity基本クラスの一部であるfindViewById()などの複雑さが生じます。今説明したのと同じ問題に遭遇することなく、インターフェイスまたはコンポジットをどのように作成するかわからないため、これは重要です。
ここの誰かがこの問題に遭遇し、実行可能な解決策を考え出しますか?