以下是我的情况:
我有一个图书馆项目和一个基于它的项目。现在在库中,我有两个类 A 和 B,其中 A 使用 B。在使用库的项目中,我有另一个类 B,它应该覆盖库中的 B 类。
但是每次 A 类调用时,它都会从库中进入 B 类。如何告诉 Android 我的项目中的 B 类应该使用库中的 B 类代替?
以下是我的情况:
我有一个图书馆项目和一个基于它的项目。现在在库中,我有两个类 A 和 B,其中 A 使用 B。在使用库的项目中,我有另一个类 B,它应该覆盖库中的 B 类。
但是每次 A 类调用时,它都会从库中进入 B 类。如何告诉 Android 我的项目中的 B 类应该使用库中的 B 类代替?
这不适用于当前布局。您必须使用策略模式。在您的库中使用构造函数定义 LibA,该构造函数在构造函数中采用 LibB 类型的对象:
class LibA{
LibB b;
public LibA(LibB b)
this.b = b;
}
}
然后,您可以在项目中覆盖 LibB,并使用扩展 LibB 的类创建 LibA:
class ProjectB extends LibB{
}
LibA a = new LibA(new ProjectB());
回答涡轮问题:
你想从你的图书馆开始项目活动。因此,然后将创建的代码移动Intent
到您的 Projects中,因为只有在您的项目中您才知道Activity
要启动的类型或名称。
您在评论中提到的解决方案(此处)通过猜测应该启动Intent
的名称在库项目中创建。Activity
这并没有什么真正的问题,但这不是一个优雅的解决方案。您只能Activities
按照该特殊命名方案开始。正因为如此,您不能Activities
像从其他库那样在您的项目中可见的任意启动Activities
,您无法更改类的名称。
要将Intent
创建移动到您的库中,您可以使用策略、模板或工厂方法模式。有关与您的库设计相匹配的更多(创造性)模式,请参阅Wikipedia 上的设计模式。
一个简单的解决方案是:
创建一个抽象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);
}
}
正如我从您的评论中看到的,您的 A 类使用 B 类
但是 B 类应该根据您使用的项目而有所不同。
我认为您需要创建一个基类,例如 BaseB,它将成为 A 类中的一个实例变量,并且您可能为此有一个 setter 和 getter 或者您可以将其作为传递给 A 类的构造函数的参数。并且在实例化 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
}