¿Por qué el compilador da un mensaje de error cuando se reduce la visibilidad de un método al anularlo en la subclase?¿Por qué no puede reducir la visibilidad de un método en una subclase Java?
Respuesta
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.
Porque los subtipos deben poder usarse como instancias de su supertipo.
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.
- 1. No se puede reducir la visibilidad del método método heredado del padre
- 2. Java, no puede reducir la visibilidad del método heredado de objeto
- 3. Reducir la visibilidad al implementar la interfaz en Java
- 4. En Java, ¿qué sucede cuando tienes un método con una palabra clave de visibilidad no especificada?
- 5. ¿Qué métodos puede heredar una subclase en Java?
- 6. Java: Anulando un método abstracto en la subclase
- 7. Llamar a un método de subclase en Java
- 8. En Java, ¿por qué un método de superclase no puede acceder a métodos/variables protegidos o privados desde una instancia de subclase?
- 9. ¿Por qué hacer un método volátil en Java?
- 10. ¿Por qué UIPopoverController no es una subclase UIViewController?
- 11. ¿Por qué no se permite delimitar el alcance de un método al anular
- 12. ¿Por qué una enum de Java no puede ser definitiva?
- 13. ¿Qué es una subclase
- 14. Visibilidad Java campo privado
- 15. ¿Por qué el método "propio" de módulo no puede convertirse en un método único de clase?
- 16. Comprobación de la visibilidad método en PHP
- 17. No se puede sangrar la subclase UITableViewCell
- 18. ¿Puede un constructor devolver una subclase?
- 19. En C#, ¿por qué un método anónimo no puede contener una declaración de rendimiento?
- 20. Sobrecarga de un método en la subclase (Enum vs int)
- 21. ¿Por qué @decorator no puede decorar un método estático o un método de clase?
- 22. ¿Se puede anular un método privado en superclase en la subclase?
- 23. Java: ¿por qué no puede iterar sobre un iterador?
- 24. ¿Por qué no hay un método Convert.toFloat()?
- 25. Evitar que una subclase de C# sobrescriba un método
- 26. ¿Por qué no puede usar la palabra clave 'this' en un método estático en .Net?
- 27. ¿Por qué mi subclase no puede acceder a una variable protegida de su superclase, cuando está en un paquete diferente?
- 28. ¿Por qué un delegado no puede hacer referencia a un método no estático cuando se usa en un método estático?
- 29. ¿Por qué la palabra clave 'this' no se puede usar en un método estático?
- 30. ¿Por qué no se puede incrustar Runnable en un subproceso?
¿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
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