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

VKu*_*urt 11 android class project android-library

以下是我的情况:

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

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

tha*_*sma 4

这不适用于当前布局。你必须使用策略模式。在您的库中使用构造函数定义 LibA,该构造函数在构造函数中采用 LibB 类型的对象:

class LibA{
    LibB b;
    public LibA(LibB b)
        this.b = b;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在项目中覆盖 LibB 并使用扩展 LibB 的类创建 LibA:

class ProjectB extends LibB{

}

LibA a = new LibA(new ProjectB());
Run Code Online (Sandbox Code Playgroud)

回答涡轮问题:

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

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

要将Intent创建的内容移至您的库中,您可以使用策略、模板或工厂方法模式。请参阅维基百科上的设计模式,了解更多与您的库设计相匹配的(创意)模式。

一个简单的解决方案是:

创建一个摘要LibraryActivity并从中扩展您的项目活动。定义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);
    }        
}
Run Code Online (Sandbox Code Playgroud)