14

以下是我的情况:

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

但是每次 A 类调用时,它都会从库中进入 B 类。如何告诉 Android 我的项目中的 B 类应该使用库中的 B 类代替?

4

3 回答 3

4

这不适用于当前布局。您必须使用策略模式。在您的库中使用构造函数定义 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);
    }        
}
于 2011-07-03T16:54:27.610 回答
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.
于 2011-07-03T16:58:40.197 回答
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

}
于 2012-02-27T07:17:40.653 回答