如何重写Android库项目中的类?

如何重写Android库项目中的类?,android,class,project,android-library,Android,Class,Project,Android Library,以下是我的情况: 我有一个图书馆项目和一个基于它的项目。现在在库中我有两个类A和B,其中A使用B。在使用库的项目中,我有另一个类B,它应该覆盖库中的类B 但每次A类调用时,它都会从库中返回到B类。 我如何告诉Android应该使用我项目中的B类而不是库中的B类?这不适用于当前布局。你必须使用策略模式。在库中,使用构造函数定义LibA,该构造函数接受构造函数中LibB类型的对象: class LibA{ LibB b; public LibA(LibB b) thi

以下是我的情况:

我有一个图书馆项目和一个基于它的项目。现在在库中我有两个类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());

对Turbos问题的答复:

您希望从库开始项目活动。因此,将创建
意图的代码移动到您的项目中,因为只有在您的项目中,您才知道要启动的
活动的类型或名称

您在注释()中提到的解决方案通过猜测应该启动的
活动的名称,在库项目中创建
意图。这并没有什么问题,但这不是一个优雅的解决方案。您只能启动遵循该特殊命名方案的
活动
。正因为如此,您不能从其他库启动在项目中可见的任意
活动,如
活动
,在其他库中,您不能更改类的名称

要将
Intent
创建移动到库中,您可以使用策略、模板或工厂方法模式。有关与库设计相匹配的更多(创造性)模式,请参见

一个简单的解决办法是:

创建一个抽象的
LibraryActivity
,并从中扩展您的ProjectActivities。
LibraryActivity
定义了一个抽象方法,该方法返回
Intent
。该抽象方法的实现在您的
项目活动中完成

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类应该根据您使用的项目而有所不同

我认为您需要创建一个基类,比如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

}

图书馆里的B和你的都在同一个包裹里吗?我不确定我是否理解你的问题。A和B都在库中,因为A将由其他项目共享,A需要B。B类对每个项目的实现方式不同,因此每个项目都应该使用自己的B类(以及库中的A类)。好的,我来回答你的问题,根据这一新信息。既然Android
活动
类没有构造函数,那么如何对这些类进行调整呢?@Turbo I为无法使用自定义构造函数的情况添加了一个示例。感谢您提供更多的答案。为了澄清,这意味着如果LibActivity不是根活动(即它实际上是从另一个活动启动的,比如MainActivity),那么我们将不得不继续使用覆盖和工厂方法?我这样问是因为有时候需要修改的活动离屏幕/活动只有几步之遥。我想我不太理解你的问题。LibActivity(在我的示例中)不能实例化-它是抽象的。这里的代码显示了如何实现一个库,允许在使用库时自定义某些任务。抱歉,我错过了那个关键字。我的问题是,假设您有两个项目,每个项目都需要返回自己的LibB修改类。它们都有扩展
LibActivity
的活动,但是如果有核心库项目代码通过意图启动
LibActivity
,则需要在意图中提供该类的名称。有两个名字,因为我们有两个项目申请。我最后用了这个问题的答案:尽管我不知道你的答案是否有效。