在Java中阻止运行时方法覆盖

时间:2013-06-10 19:36:48

标签: java android

  • A类的方法是x()
  • B类继承A并覆盖x()
  • C类继承B并覆盖x()

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

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

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

更新

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

3 个答案:

答案 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,然后使用某些条件在DC的实例之间进行选择。您可以使用反射在运行时汇编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();
    }
}