2011-06-24 7 views
11
public class BaseClass { 
    public void start() { 
     // do something 
    } 
} 

public class ClassA extends BaseClass { 

} 

ClassA c = new ClassA(); 
c.start(); 

En el siguiente código deseo utilizar el método start() como se definió en la superclase, he visto en muchos otros códigos de desarrollador que anulan el método en la superclase y luego llaman el super. ¿Hay alguna razón para eso?Java: ¿se extiende una clase y se reutilizan los métodos?

public class ClassA extends BaseClass { 
    @Override 
    public void start() { 
     super.start(); 
    } 
} 
+1

@Jeanne Boyarsky, justo en el dinero! es una cuestión de preferencia para cada desarrollador, por lo general su documentación debe ser lo suficientemente buena como para que no tenga que hacer esto, pero una mayor claridad siempre es mejor que menos. – bdparrish

Respuesta

11

Clarity? Algunos desarrolladores sienten que es más claro mostrar el método en la subclase. Estoy en desacuerdo. Es información redundante.

Al menos desde Java 5, puede agregar una @Override para que el compilador le dirá si la firma cambia/desaparece.

A excepción de los constructores. Para los constructores, realmente tienes que crear el tuyo con la misma firma y delegar hacia arriba. En este caso, omitir no es equivalente sin embargo.

+2

+1 Es redundante y confuso. Si ve que el método fue anulado (que el IDE le mostrará, incluso si no puede ver el origen), usted pensaría que también hace algo más que el valor predeterminado heredado. Además, si anula el método, debe haber Javadoc para él. – Thilo

+1

@Thilo: No me parece más claro personalmente y no lo practico en mi equipo. El argumento es que las personas nuevas en Java no tienen el hábito de buscar en la superclase. (El mismo argumento para no usar el operador ternario.) No me gustan las cosas que son demasiado complacientes con los desarrolladores que no son de Java. Uno debe aprender las convenciones y expresiones idiomáticas de los idiomas en los que uno está trabajando. –

6
public class ClassA extends BaseClass { 
    @Override 
    public void start() { 
    super.start(); 
    } 
} 

hace exactamente lo mismo que no anulando en nada a este

public class ClassA extends BaseClass {}

A menos que tenga alguna funcionalidad adicional a añadir (en cuyo caso se llama método de super clase y luego agregar su lógica adicional) o para hacer algo diferente (no se llama al método de la superclase y simplemente se define una lógica diferente), es mejor no anular el método de la superclase (y llamar al método de la superclase) porque no tiene sentido.

8

Anulación de un método, haciendo algo especial, y luego llamar a super.method() se llama decorar un método - que está añadiendo al comportamiento. Lea más aquí: Decorator Pattern.

Anulación sin llamar al método de súper es simplemente primordial un método - cambiar el comportamiento.

1

A veces hago esto (temporalmente, durante el desarrollo) cuando quiero establecer un punto de ruptura allí.

+0

¿Por qué no establece el punto de quiebre en la superclase? – javaguy

+0

@javaguy: Entonces también se rompe allí para las instancias de superclase. – Thilo

0

La razón principal detrás del concepto de herencia es la generalización de las funciones u operaciones que son comunes entre las subclases. Tiene sentido anular solo cuando necesitamos personalizar la operación para la subclase particular.

  • Pero un lugar en el que no es necesario hacer una anulación es, que usted ha sobrecargado el super constructor por defecto de clase, a continuación, en la sub-clase es necesario mencionar la invocación del constructor de la superclase sobrecargado como el primera línea en el constructor de su subclase (es decir, el objeto Superclase debe crearse antes de la creación de subclase). Por ejemplo

BaseClass clase {

BaseClass (arg1) {

}

}

clase A se extiende BaseClass {

A { súper (arg1); }

}

En otros lugares que sólo añadiría una redundancia del código, que no es en absoluto necesario

Cuestiones relacionadas