如何重写Android库项目中的类?
以下是我的情况: 我有一个图书馆项目和一个基于它的项目。现在在库中我有两个类A和B,其中A使用B。在使用库的项目中,我有另一个类B,它应该覆盖库中的类B 但每次A类调用时,它都会从库中返回到B类。如何重写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
我如何告诉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
,则需要在意图中提供该类的名称。有两个名字,因为我们有两个项目申请。我最后用了这个问题的答案:尽管我不知道你的答案是否有效。