2012-07-14 9 views
9

? En Java, cuando anulo un método, el compilador marca cualquier intento de reducir la visibilidad como un error. Por ejemplo: no puedo anular un método público como protegido, aunque puedo anular un método protegido como público.¿Por qué no se permite delimitar el alcance de un método al anular

Estoy interesado en conocer la decisión/pensamiento de diseño detrás de esta regla.

+0

Esta pregunta se formuló hace unos días, pero ¿cuál sería el punto? –

+1

http://stackoverflow.com/q/11343763/1475461 mira esto para la discusión que se tuvo la semana pasada sobre el problema –

Respuesta

14

Una subclase siempre debe cumplir el contrato de la superclase. Ver Liskov Substitution principle.

La visibilidad de los métodos forma parte de este contrato. Entonces cualquier cosa públicamente visible en la superclase también debería ser pública en la subclase.

+1

SOLID answer ....! –

14

Considere una clase B que hereda de A. A.m() es público. Ahora considere este código:

A obj = new B(); 
obj.m(); 

¿Se debe permitir esta llamada? Sí, debería, porque obj es un objeto de tipo A! También es un objeto del tipo B, pero eso no es necesariamente conocido para el que usa el objeto.

Todos los objetos del tipo A deben cumplir el contrato (interfaz) para A. B se extiende a A y, por lo tanto, también debe cumplir con ese contrato.

3

Mientras liberamos o implementamos el nivel de acceso, deberíamos buscar el mismo nivel de acceso o más amplio para ese nivel de acceso.

private < (default) < protected < public 

Público es más amplio nivel.

En la interfaz, todos los miembros son públicos predeterminados. Entonces, mientras implementamos o desalojamos tenemos que ir solo para público.

Cuestiones relacionadas