Llamando super en extremo

Estoy muy confundido por la forma en que la gente usa super en métodos sobreescritos. Como cuál es el diferente entre

@Override protected void onResume() { // some logic here super.onResume(); } 

y

  @Override protected void onResume() { super.onResume(); // some logic here } 

¿Realiza cualquier pre-procesamiento cuando llamamos super () al final, porque generalmente llamamos super para inicializar el constructor padre.

Cualquier diferencia en el rendimiento con ambos tipos.

En primer lugar, plain super() no está permitido en los métodos en absoluto – sólo en los constructores. Supongo que en realidad quería decir super.someMethod() para un método apropiado.

¿Realiza cualquier pre-procesamiento cuando llamamos super () al final, porque generalmente llamamos super para inicializar el constructor padre.

El uso de super en un método es algo diferente de usarlo en un constructor.

En un constructor, super (o this ) se requiere para ser la primera declaración (si está presente, con un implícito super() otro modo) y sólo puede llamar a un constructor.

En un método, el uso de super.someMethod() simplemente llama a la implementación de superclase de someMethod . Se puede llamar desde cualquier método (no es necesario anular el someMethod en ese momento) y se puede llamar en cualquier momento del método. Se invoca en el momento en que lo llaman, simplemente evita la llamada polimórfica a una implementación sobresaliente.

Así que básicamente, donde – y si – lo llamas depende de lo que quieres que el efecto sea. En algunos casos, puede que desee llamar a la implementación de la superclase del mismo método antes de su propio comportamiento personalizado y, en algunos casos, puede que desee llamarlo después de su propio comportamiento personalizado.

Eso realmente depende de la lógica que el método implemente. A veces se llama primero, a veces al final, ya veces nunca. Por ejemplo, si algún cálculo del método de superclase es realmente importante, entonces se llamará primero. O si se intenta el cálculo en el método de subclase pero sin un buen resultado (el resultado es nulo) se intenta en el método de subclase. Realmente no hay una buena respuesta a esta pregunta, excepto que realmente depende.


Ejemplo 1:

Un proveedor de etiquetas que extrapola el tiempo del objeto Date y lo devuelve a la interfaz de usuario para mostrar:

 public class TimeLabelProvider { public String getText(Date element) { //extrapolate time from the element return time; } } 

Un proveedor de etiquetas que extrapola la fecha y la hora del objeto Date y lo devuelve a la interfaz de usuario para mostrar:

 public class DateTimeLabelProvider extends TimeLabelProvider { @Override public String getText(Date element) { //extrapolate date from the element String date = ... //now get time string. We don't need to repeat logic, //its already implemented in super method! String time = super.getText(element); return date + " " + time; } } 

Ejemplo 2

Si su proyecto tiene una jerarquía de clases profunda para elementos de interfaz de usuario, por ejemplo,

 DropDownField extends TextField extends Field extends AbstractField 

Ahora, cada una de las clases agregó algunos elementos de interfaz de usuario al campo, por ejemplo, DropDownField agregó un menú y una pequeña flecha a la derecha del campo, TextField añadió un validador, AbstractTextField agregó un bloque blanco para escribir texto, etc. Para disponer de elementos tendrías que hacer una disposición multinivel como ésta:

 public class DropDownField extends TextField { @Override public void dispose() { menu.dispose(); arrow.dispose(); //let text field dispose of its elements super.dispose(); } } 

Eche un vistazo al método okPressed () para los diálogos swt. Por lo general, la gente anula okPressed en un diálogo para hacer algún trabajo deseado. El super.okPressed () suele disponer del diálogo sin hacer nada. Así que se llama al final después de todo su trabajo está hecho.

 public void okPressed() { ///Do your work super.okPressed() } 

La palabra clave super es una manera de llamar a un comportamiento de clase padre en una clase especializada.

En un constructor, llamar

 super(args) 

Permite elegir el constructor de la clase padre que se debe utilizar.

En un método, llamar

 super.parentMethod(args) 

Le permite llamar al comportamiento de la clase padre incluso si la clase actual reemplaza parentMethod. Normalmente se utilizaría para agregar alguna lógica antes o después de la clase padre.

Vocación

 super(); 

En un método no se compilará ya que usó la super sintaxis del constructor en un método.

En cuanto a si volver a llamar al método super en la primera línea, o la última línea de su método … depende de la semántica del método super. En otras palabras, no hay manera de saber que no sea buscar la documentación (o código) para el método. También puede haber casos en los que no desea llamar a través del método super en absoluto.

Usted parece estar preguntando sobre onResume() . Mientras que los documentos no dicen, el patrón que siempre he utilizado es volver a llamar al método super en la primera línea. Para onPause() , vuelvo a llamar en la última línea. La idea es que los métodos estupendos envuelven su pausa personalizada / reanudar la lógica …

 super on resume custom on resume ... custom on pause super on pause 
  • Uso de certificados de cliente / servidor para la autenticación de dos vías socket SSL en Android
  • Cómo usar arrastrar y soltar en la vista de reciclador utilizando la base de datos en tiempo real firebase
  • No se puede establecer el volumen en BlackBerry Playbook
  • ¿Diferencia entre appcompat_v7 y android-support-v7-appcompat?
  • Pase el objeto en el que se incrusta una clase java como parámetro
  • ¿Cómo puedo escribir mediante programación un acceso directo a una página específica en la pantalla de inicio del lanzador de Android?
  • Uso de fuentes personalizadas para todo el texto de la aplicación que no funciona con Lollipop
  • Android - ¿Cómo rotar Rect Object?
  • Solicitud de lote con youtube api: obtenga la información de vídeo más reciente de varios canales
  • CancelaciónExcepción al utilizar ExecutorService
  • NoClassDefFoundError: Resolución fallida de: Lokhttp3 / internal / Platform
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.