Cómo puedo saber cuándo / dónde invocar el método anulado de la superclase

Esta pregunta se me ocurrió durante la programación de una aplicación de Android, pero parece ser una cuestión de programación general más.

La situación es, estoy extendiendo (subclase-ing) una clase de una biblioteca, y sobrescribiendo un método. ¿Cómo sé si debo invocar el método de super-clase? ¿y cuando? (En el principio del método anulado o al final?)

Por ejemplo, estoy reemplazando el método "public boolean onCreateOptionsMenu (Menu menu)" de la clase "Activity" en la plataforma Android. Y vi a alguien escribir "return super.onCreateOptionsMenu (menu)" al final del método, en un ejemplo. Pero, ¿cómo sé que debería hacerse de esta manera? Y es correcto o no? ¿Cuál es la diferencia si comienzo mi método con "super.onCreateOptionsMenu (menu)"?

BR Henry

No creo que puedas responder a esta pregunta en abstracto: depende del comportamiento del método de superclase que estás anulando.

Dependiendo de las circunstancias, puede ser apropiado:

  • Llame a super primero
  • Llame al último
  • Maneje algunos casos usted mismo (personalizaciones), llame a super para el resto
  • Nunca llame a super

Esperemos que la documentación para la clase particular que está reemplazando le dirá si / cuando es necesario llamar a super.

Desafortunadamente, no hay ninguna regla para esto. Necesita consultar los documentos de la API y llamar a super si los documentos dicen que necesita.

Una pista sobre si es probable que necesite o no en el caso de Android es si el método que está reemplazando es uno de los métodos del ciclo de vida. En este caso, puede estar bastante seguro de que necesita llamar a super.

Estas son preguntas válidas, pero lamentablemente no hay una regla general a seguir aquí.

Si o no usted necesita llamar al método estupendo depende del hecho si el método estupendo hace algo que necesita ser hecho. En otras palabras: ¿está extendiendo o reemplazando el método anulado? Una buena documentación API de la clase debe darle la respuesta. Además, las bibliotecas a menudo siguen algunas convenciones para dejar claro cómo usarlas.

La respuesta a la pregunta de dónde colocar la llamada súper depende de cuándo desea ejecutar su extensión. ¿Es necesario ejecutar antes o después del método super? La mayoría de las veces usted primero llama super y luego hacer algo extra. Pero si necesita preparar algo para el método super, por ejemplo modificando algún estado del objeto o manipular los argumentos, coloca el código antes de la super llamada. Una vez más, la documentación de la API debe darle la respuesta aquí.

Android en la mayoría de los casos causa una excepción si te olvidas de llamar a super. Confiaría en que no tienes que llamar a super si no lo haces y no tira.

En las discusiones de los grupos de google, se desarrollaron algunas prácticas recomendadas para los métodos de ciclo de vida (no son respaldadas oficialmente por datos pero utilizadas por muchos programadores):

  • Si está en un método de creación como onCreate, onResume, etc., llame a super como la primera instrucción. Por lo tanto, puede estar seguro de que todo lo que tiene que prepararse de la superclase está preparado.
  • Si está en un método de cierre como onSaveInstanceState, onPause llama super last. Ahora usted puede estar seguro de que nada se quita o cambia a un estado malo antes de que todo se hace.

No es necesario que llames al super.method (), solo lo llames cuando lo necesites donde lo necesites.

Cuando reemplaza un método en una clase secundaria, depende del tipo de la instancia en la que está llamando a ese método.

por ejemplo:

Class Animal{ public eat(){ //.. } } Class Dog extends Animal{ public eat(){ //.. } } now if you say new Dog().eat() it executes Dog's eat method. if you say new Animal().eat() it executes Animal's eat method. 

Y usted puede tener código como este

  Animal a = new Dog(); a.eat(); 

Que otra vez ejecuta el perro come el método como la instancia real es del tipo Perro.

  • Llenar el color en polígono mientras los puntos se cruzan en Android
  • Java.lang.Object no se puede resolver en Eclipse
  • Cómo agregar un contacto a un grupo android
  • Revise la fecha con la fecha de hoy
  • ProgressDialog Actividad de fondo Fade Out Animation
  • No se puede localizar el símbolo 'tcgetattr' referido por "libcrypto.so"
  • Estoy tratando de enviar datos con NXJ y Android Bluetooth
  • Error de pelusa en Okio
  • Error al importar jar en un proyecto android
  • Pasar ArrayList de objetos a través de la intención - Java (Android)
  • No se puede crear ObjectInputStream con InputStream para un socket Bluetooth en la plataforma Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.