Evitar el reemplazo del método en tiempo de ejecución en Java

  • La clase A tiene el método x ()
  • La clase B hereda A y anula x ()
  • La clase C hereda B y anula x ()

Quiero crear una librería de clase que amplíe la clase de actividad y reemplace el método que maneja el botón de retroceso en Android (y más métodos). Quiero que el desarrollador para ampliar mi clase y seguir utilizando su clase de actividad como de costumbre, pero para obligar a llamar a la súper método.

¿Alguna idea de cómo la clase B puede evitar que su método x sea reemplazado en tiempo de ejecución ?

(No quiero finalizar x en la clase B.)

Actualizar:

OK, permítanme tratar de explicar lo que quiero lograr – Quiero hacer una lib de clase que se extenderá clase de actividad y anular el método que maneja el botón de nuevo en Android (y más métodos). Quiero que el desarrollador para ampliar mi clase y seguir utilizando su clase de actividad como de costumbre, pero para obligar a llamar a la súper método. Si no lo hace, estoy en problemas.

OK, permítanme tratar de explicar lo que quiero lograr – Quiero hacer una lib de clase que se extenderá clase de actividad y anular el método que maneja el botón de nuevo en Android (y más métodos). Quiero que el desarrollador para ampliar mi clase y seguir utilizando su clase de actividad como de costumbre, pero para obligar a llamar a la súper método. Si no lo hace, estoy en problemas.

Una solución es hacer que su método sea final , pero que lo llame a un segundo método que usted declara como abstract . A continuación, haga que el otro desarrollador escriba la implementación para ese método abstract .

Así, por ejemplo, su código podría verse así:

 public final void method() { // do your stuff // ... // call the method that the other developer wrote doMethod(); } protected abstract void doMethod(); 

Cualquiera que esté agregando funcionalidad que se debe llamar al final de su método entonces debe implementar el método abstracto para extender su clase y tener su compilación de código:

 protected void doMethod() { // do more stuff } 

A continuación, seguirá llamando a method() como lo hace actualmente. (Pero tenga en cuenta que esto no impide que alguien más llame a doMethod() directamente, por lo que tendrá que documentar claramente la API).

Puede hacer su método en el paquete de clase B protegido y colocar la clase C en otro paquete.

No sé si se adapte a sus necesidades, pero puede inventar una clase más, D extends B y luego elegir entre la instancia de D y C , utilizando algunos criterios. Puede montar D en tiempo de ejecución utilizando la reflexión, por lo que dará resultado similar al siguiente:

 class A { void f() {System.out.println("Af()");} } class B extends A { void f() {System.out.println("Bf()");} } class C extends B { void f() {System.out.println("Cf()");} } 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(); af(); } } 
  • Lectura de un documento PDF en Android
  • Visualización de texto de desplazamiento en forma de carpintería en Android
  • Android - ¿Se puede utilizar el Cursor SQLite después de cerrar la base de datos?
  • Android Geocoder getFromLocationName devuelve siempre null
  • Crear un cuadro de diálogo personalizado con lista de botones de radio
  • Error de sintaxis: Insertar "}" para completar el bloque
  • Haz que el signo más signifique una cadena en java
  • Cómo jugar notas individuales de archivo midi en LibGDX?
  • Cómo crear un diseño de Android de cuatro dígitos
  • Phonegap vs nativo en la prueba de rendimiento de Android
  • Cómo programar una ejecución de código en android o: ¿qué son exactamente los hilos de daemon en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.