我想创建一个类lib,它将扩展Activity类并覆盖处理Android中后退按钮的方法(以及更多方法)。我希望开发人员像往常一样扩展我的类并继续使用他的活动类,但要强制他调用方法的超级。
知道B类如何防止在运行时覆盖其x方法?
(我不想在B级中完成x。)
好的,让我试着解释一下我想要实现的目标 - 我想创建一个类lib,它将扩展Activity类并覆盖处理Android中后退按钮的方法(以及更多方法)。我希望开发人员像我一样扩展我的类并继续使用他的活动类,但要强制他调用方法的超级。如果他不这样做,我就麻烦了。
答案 0 :(得分:6)
好的,让我试着解释一下我想要实现的目标 - 我想做一个 类lib将扩展Activity类并覆盖该方法 处理Android中的后退按钮(以及更多方法)。我想要 开发人员扩展我的课程并继续使用他的活动课程 通常,但要强制他调用方法的超级。如果他不这样做的话 那,我遇到了麻烦。
一种解决方案是制作您的方法final
,但让它调用您声明为abstract
的第二种方法。然后让其他开发人员为该abstract
方法编写实现。
例如,您的代码可能如下所示:
public final void method() {
// do your stuff
// ...
// call the method that the other developer wrote
doMethod();
}
protected abstract void doMethod();
无论是谁添加必须在方法结束时调用的功能,必须实现抽象方法,以扩展您的类并编译其代码:
protected void doMethod() {
// do more stuff
}
然后你会像现在一样继续拨打method()
。 (但请注意,这不会阻止其他人直接致电doMethod()
,因此您仍需要清楚地记录API。)
答案 1 :(得分:1)
您可以使B类包中的方法受到保护,并将C类放在另一个包中。
答案 2 :(得分:0)
不知道它是否符合您的需求,但您可以再创建一个类D extends B
,然后使用某些条件在D
和C
的实例之间进行选择。您可以使用反射在运行时汇编D
,因此它将得到类似于以下结果:
class A {
void f() {System.out.println("A.f()");}
}
class B extends A {
void f() {System.out.println("B.f()");}
}
class C extends B {
void f() {System.out.println("C.f()");}
}
class D extends B {
void f() {
super.f();
}
}
class Sample {
public static void main(String[] args) {
A a;
boolean callC = false;
if (callC) a = new C();
else a = new D();
a.f();
}
}