以下は私の状況です:
ライブラリプロジェクトとそれに基づくプロジェクトがあります。現在、ライブラリには2つのクラスAとBがあり、AはBを使用しています。ライブラリを使用するプロジェクトには、ライブラリからクラスBをオーバーライドする必要がある別のクラスBがあります。
しかし、クラス A が呼び出しを行うたびに、ライブラリからクラス B に行き着きます。プロジェクトのクラス B をライブラリのクラス B の代わりに使用する必要があることを Android に伝えるにはどうすればよいですか?
以下は私の状況です:
ライブラリプロジェクトとそれに基づくプロジェクトがあります。現在、ライブラリには2つのクラスAとBがあり、AはBを使用しています。ライブラリを使用するプロジェクトには、ライブラリからクラスBをオーバーライドする必要がある別のクラスBがあります。
しかし、クラス A が呼び出しを行うたびに、ライブラリからクラス B に行き着きます。プロジェクトのクラス B をライブラリのクラス B の代わりに使用する必要があることを Android に伝えるにはどうすればよいですか?
これは、現在のレイアウトでは機能しません。戦略パターンを使用する必要があります。ライブラリで、コンストラクターでタイプ LibB のオブジェクトを取るコンストラクターを使用して LibA を定義します。
class LibA{
LibB b;
public LibA(LibB b)
this.b = b;
}
}
次に、プロジェクトで LibB をオーバーライドし、LibB を拡張するクラスで LibA を作成できます。
class ProjectB extends LibB{
}
LibA a = new LibA(new ProjectB());
ターボの質問への回答:
ライブラリから Project-Activities を開始したいと考えています。次に、 を作成するコードをIntent
Projects に移動します。プロジェクトでのみ、開始する のタイプまたは名前を知ってActivity
いるからです。
コメント ( here )で言及したソリューションは、開始する必要があるIntent
の名前を推測して、ライブラリ プロジェクトにを作成します。Activity
それは本当に悪いことではありませんが、エレガントな解決策ではありません。Activities
その特別な命名スキームに従うもののみを開始できます。そのため、クラスの名前を変更できない他のライブラリのActivities
ように、プロジェクトで表示される任意のものを開始することはできません。Activities
作成物をライブラリに移動するにはIntent
、戦略、テンプレート、またはファクトリ メソッド パターンを使用できます。ライブラリの設計に一致するさらに多くの (創造的な) パターンについては、ウィキペディアのデザイン パターンを参照してください。
簡単な解決策は次のとおりです。
抽象LibraryActivity
を作成し、そこから ProjectActivities を拡張します。はLibraryActivity
、 を返す抽象メソッドを定義しますIntent
。その抽象メソッドの実装は、ProjectActivities
.
abstract class LibActivity{
private void doSomething(){
//Library does something
//and finally calls createIntent() to start an project specific Activity
startActivity(this.createIntent());
}
protected abstract Intent createIntent();
}
class ProjectActivity extends LibActivity{
protected Intent createIntent(){
return new Intent(ProjectActivity.this, AnyActivityYouWant.class);
}
}
あなたのコメントからわかるように、クラスBを使用するクラスAがあります
ただし、クラス B は、使用しているプロジェクトによって異なるはずです。
クラスAのインスタンス変数になるBaseBという基本クラスを作成する必要があると思います。これにはセッターとゲッターがあるかもしれません。または、クラスAのコンストラクターに渡されるパラメーターにすることもできます。どちらを使用するかを選択する必要があります。
コードを見てみましょう
Class A {
private BaseB b;
public A(BaseB aB) {
b = aB;
}
public void set(BaseB aB) {
b = aB;
}
public BaseB get() {
return b;
}
}
interface BaseB {
}
// in the library have this
class B implements BaseB {
}
// in your project have the other implementation
class B implements BaseB {
}
// you can then instantiate A like this
A a = new A(new B());
// you can choose which one to use here in the previous statement.
これが最善の方法かどうかはわかりませんが、私はこのようにしています。
プロジェクトからクラス A を作成し、このクラスはライブラリ プロジェクトから拡張されます
public class A extends libraryProject_A{
//here i put all methods from the new class B to override methods from library class B
}