3
  • A 类有方法 x()
  • B 类继承 A 并覆盖 x()
  • C 类继承 B 并覆盖 x()

我想创建一个类库,它将扩展 Activity 类并覆盖处理 Android 中的后退按钮的方法(以及更多方法)。我希望开发人员扩展我的类并像往常一样继续使用他的活动类,但要强制他调用该方法的超级。

知道 B 类如何防止其 x 方法在运行时被覆盖吗?

(我不想在 B 类中完成 x。)

更新:

好的,让我试着解释一下我想要实现的目标 - 我想创建一个类库,它将扩展 Activity 类并覆盖处理 Android 中的后退按钮的方法(以及更多方法)。我希望开发人员扩展我的类并像往常一样继续使用他的活动类,但要强制他调用该方法的超级。如果他不这样做,我就有麻烦了。

4

3 回答 3

6

好的,让我试着解释一下我想要实现的目标 - 我想创建一个类库,它将扩展 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。)

于 2013-06-10T20:04:26.407 回答
1

您可以在 B 类包中保护您的方法,并将 C 类放在另一个包中。

于 2013-06-10T19:47:29.203 回答
0

不知道它是否适合您的需求,但您可以再发明一个类,D extends B然后使用一些标准在Dand的实例之间进行选择。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();
    }
}
于 2013-06-10T19:51:18.563 回答