如何覆盖Android库项目中的类?

时间:2011-07-03 16:38:37

标签: android class project android-library

以下是我的情况:

我有一个图书馆项目和一个基于它的项目。现在在库中我有两个类A和B,其中A使用B.在使用库的项目中,我有另一个类B,它应该覆盖库中的类B.

但是每次A级拨打电话时,它都会从图书馆的B级结束。 如何告诉Android我的项目中的B类应该从库中使用B类的INSTEAD?

3 个答案:

答案 0 :(得分:3)

这不适用于当前布局。您必须使用策略模式。在您的库中使用构造函数定义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());

回答Turbos问题:

您想从图书馆启动项目活动。然后将创建Intent的代码移动到您的项目中,因为只有在您的项目中,您才知道要启动的Activity的类型或名称。

您在评论中提到的解决方案(here)通过猜测应该启动的Intent的名称来在库项目中创建Activity。这没有什么不妥,但它不是一个优雅的解决方案。您只能启动遵循该特殊命名方案的Activities。因此,您无法启动在您的项目中可见的任意Activities,例如Activities来自其他库的Intent,您无法更改该类的名称。

要将LibraryActivity创建移动到库中,您可以使用策略,模板或工厂方法模式。有关与您的图书馆设计相匹配的更多(创作)模式,请参阅Design Patterns on Wikipedia

一个简单的解决方案是:

创建一个抽象LibraryActivity并从中扩展ProjectActivities。 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); } }

中完成的
{{1}}

答案 1 :(得分:0)

正如我从您的评论中看到的,您有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.

答案 2 :(得分:0)

我不知道这是否是最佳方式,但我是这样做的;

我从项目中创建了一个A类,这个类从库项目

扩展而来
public class A extends libraryProject_A{

//here i put all methods from the new class B to override methods from library class B

}