如何在Android库项目中重写类



以下是我的情况:

我有一个库项目和一个基于它的项目。现在在库中,我有两个类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的类型或名称。

您在评论(此处(中提到的解决方案通过猜测应该启动的Activity的名称,在库项目中创建Intent。这并没有什么真正的问题,但这不是一个优雅的解决方案。您只能启动遵循该特殊命名方案的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);
    }        
}

我不知道这是否是最好的方法,但我是这样做的;

我从项目中创建了一个类a,这个类从库项目扩展而来

public class A extends libraryProject_A{
//here i put all methods from the new class B to override methods from library class B
}

正如我从您的评论中看到的,您有一个使用类B 的类A

但是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.

相关内容

  • 没有找到相关文章

最新更新