2009-10-21 20 views

Respuesta

65

Porque cada instancia de la subclase aún debe ser una instancia válida de la clase base (consulte Liskov substitution principle).

Si la subclase de repente ha perdido una propiedad de la clase base (es decir, un método público, por ejemplo), ya no sería un sustituto válido para la clase base.

+2

¿Pero por qué no se nos permite sobrescribir un método protegido y cambiarlo a privado? Dado que la interfaz pública sigue siendo la misma, no rompe LSP de esta manera. – Pacerier

+0

La interfaz pública no cambia, pero la protegida sí. El código en la clase principal no puede acceder a los métodos de su propia carne y sangre :( – Elazar

1

Porque los subtipos deben poder usarse como instancias de su supertipo.

18

Porque si esto era permitido, la siguiente situación sería posible:

subclase hereda de los padres de clase. El padre tiene un método público foo, Sub hace que ese método sea privado. Ahora el siguiente código compila bien, debido a que el tipo declarado de bar es Padres:

Parent bar = new Sub(); 
bar.foo(); 

Sin embargo, no está claro cómo debe comportarse. Una posibilidad sería dejar que cause un error de tiempo de ejecución. Otra sería simplemente permitirlo, lo que haría posible llamar a un método privado desde el exterior, simplemente transfiriéndolo a la clase padre. Ninguna de esas alternativas es aceptable, por lo que no está permitido.

Cuestiones relacionadas