¿Cuál es el problema de la clase base frágil en Java?¿Cuál es el problema de la clase base frágil?
Respuesta
Una clase base frágil es un problema común con la herencia, que se aplica a Java y a cualquier otro lenguaje que admita la herencia.
En pocas palabras, la clase base es la clase que está heredando, y a menudo se llama frágil porque los cambios en esta clase pueden tener resultados inesperados en las clases que heredan de ella.
Existen algunos métodos para mitigar esto; pero no hay un método sencillo para evitarlo por completo sin dejar de usar la herencia. Puede evitar que otras clases hereden de una clase etiquetando la declaración de clase como final
en Java.
Una buena práctica para evitar el peor de estos problemas es etiquetar todas las clases como definitivas a menos que específicamente intente heredarlas. Para aquellos de los que pretendan heredar, diseñelos como si estuviera diseñando una API: oculte todos los detalles de implementación; Sea estricto con lo que emite y tenga cuidado con lo que acepta, y documente el comportamiento esperado de la clase en detalle.
Una clase base se llama frágil cuando los cambios realizados en ella rompen una clase derivada.
class Base{
protected int x;
protected void m(){
x++;
}
protected void n(){
x++; // <- defect
m();
}
}
class Sub extends Base{
protected void m(){
n();
}
}
Es frágil cuando los simples cambios en la clase principal rompen la clase hija. Si está cambiando todo en el padre y eso hace que los hijos se rompan, eso no necesariamente significa que el padre era frágil; si cambias algo aparentemente benigno y las cosas se desmoronan, era frágil. –
Pero, ¿qué cambios son simples entonces, es decir, cuál es el criterio? – mlvljr
Todo lo que "Colin Pickard" ha dicho es cierto, y aquí quiero añadir a la lista de las mejores prácticas para conseguir protegidos cuando se escribe código que puede causar este tipo de problemas en el lenguaje Java .. .
- hacer todas sus clases final, ya que no quiere que se heredan
- Si no puede y tiene que utilizar la herencia (ejemplo de la clase abstracta) a continuación, hacer que todos sus métodos implementados final sea no modificado por sus subclases (incluso los métodos protegidos son una mala idea en términos generales, las subclases no deberían saber tanto sobre sus subclases) ...
- Trate de no usar una relación [es un] en lugar de tratar de usar la [utiliza un] relationsheap entre las interfaces de uso del diagrama de clases para evitar el problema se extiende ..
- Cada extiende puede ser reemplazado por implementa y si tiene que hacer una aplicación por defecto aquí es una espineta código:
public interface MyBehavior {
void doAction();
static class Implementation implements MyBehavior {
public void doAction() {
//do some stuff
}
}
}
// instead of doing extends To a class that have the doAction method
// we will make a [use a] relationShip between the Example class & the Implementation class
public class Example {
private MyBehavior.Implementation helper = new MyBehavior.Implementation();
public void doAction() {
this.helper.doAction();
}
}
- 1. ¿Este código es demasiado frágil?
- 2. ¿Cuál es el 'problema de expresión'?
- 3. ¿Cuál es el problema con la propiedad RenderMode de ToolStrip?
- 4. C++ devolviendo clase anidada con la plantilla en el problema de clase base
- 5. ¿Cuál es el problema con reduce()?
- 6. ¿Cuál es el problema con Cookie.setMaxAge (Integer.MAX_VALUE)?
- 7. ¿Cuál es el problema en esta afirmación?
- 8. cuál es el problema con AttachDbFilename
- 9. ¿Cuál es el propósito de la clase NullObject en Groovy?
- 10. ¿Cuál es el problema con setw()?
- 11. ¿Cuál es el problema con IQueryable?
- 12. ¿Cuál es el problema con char.GetNumericValue?
- 13. ¿Cuál es el problema con reftype {}?
- 14. ¿Cuál es el estado de la base de datos HTML5?
- 15. ¿Cuál es la mejor manera de diseñar este problema particular de base de datos/SQL?
- 16. OpenGL: ¿Cuál es el problema con la depreciación?
- 17. C++ La clase no es la base de sí misma
- 18. El operador del Espacio de nombres ... ¿cuál es el problema?
- 19. ¿Cuál es la relación entre la metaclase de clase Base y Derivada en Ruby?
- 20. ¿Cuál es el objetivo de la clase StatusBarItem en WPF?
- 21. ¿Cuál es el uso de la clase TelephoneNumberUtil?
- 22. ¿Cuál es el significado de la clase java.io.Serializable?
- 23. ¿Cuál es el propósito de la clase Expression?
- 24. ¿Cuál es el propósito del cargador de la clase Java?
- 25. ¿Cuál es el espacio de nombre para la clase DispatcherTimer?
- 26. ¿Cuál es el propósito de la clase TestExecution en MSTest?
- 27. Accessability inconsistente: Clase base es menos accesible que la clase
- 28. ¿Cuál es la forma correcta de implementar la comparación para una clase base?
- 29. ¿cuál es el objeto Clase (java.lang.Class)?
- 30. WPF control de usuario problema de clase base
resistir impulso para hacer referencia a un premio importante! o un álbum de NIN ... – scunliffe
Lamento decírtelo, @scunliffe, pero fallaste ;-) –
Si se dice que el problema de FBC es tener una clase base con un contrato poco claro (o incompleto) especificado para que cambiar la clase posiblemente romperá los derivados que dependen de él, ¿será eso suficiente? ¿Y podemos tener interfaces derivadas, por cierto? – mlvljr