hablando en términos generales, el Principio de Sustitución de Liskov establece que una clase derivada puede ser sustituta en lugar de la clase base sin afectar al usuario. En el caso en que la clase base es una clase abstracta, lo que significa que ningún usuario está utilizando una instancia de la clase base, ¿las restricciones de herencia de Liskov aún se aplican a la clase derivada?¿El principio de sustitución de Liskov se aplica al subtipo que heredó de la clase abstracta?
Respuesta
El hecho de que no se puede crear una instancia de una clase en particular no significa que no se puede utilizar. En este escenario, el código de llamada usa la clase base abstracta como la definición del contrato bajo el cual opera. En ese sentido, todas las clases que se derivan de la clase base deben ser intercambiables con respecto a la interfaz definida por la clase base, por lo que sí se aplica Liskov. De hecho, esta es una de las principales razones por las que desearía tener una clase base abstracta para una colección de clases que tienen un comportamiento común, por lo que puede definir operaciones en términos de la interfaz de clase base y no importar qué clase derivada en realidad estás operando.
Sí, porque una persona que llama puede hacer siempre esto:
BaseAbstractClass instance = new DerivedClass();
Las clases abstractas no entran en conflicto con LSP en absoluto. Muchas personas consideran que usar "nuevo" directamente del código del cliente es una violación del espíritu de LSP. Si ambos instancian y usan un objeto, están estrechamente vinculados a esa implementación, y no pueden "sustituirlo" en absoluto.
Considere tener el objeto creado a través de una fábrica o pasado como argumento o mediante inyección de dependencia después de haber sido creado por algún tipo de repositorio que pueda enfocarse en tomar decisiones sobre qué tipos de concreto se necesitan en diversas circunstancias.
En resumen, sí. El LSP se aplica esencialmente a todos herencia pública. El hecho de que una clase base sea abstracta no cambia eso. La clase base define una interfaz, y todas las derivadas legítimas deben cumplir todos los requisitos de esa interfaz.
Sí.
Consulte la sección "Un ejemplo real" (página 7-8) de Uncle Bob's The Liskov Substitution Principle article.
- 1. Liskov principio de sustitución - ejemplo del método primordial
- 2. ¿Cómo puedo evitar romper el Principio de sustitución de Liskov (LSP)?
- 3. C# es la interfaz que echa una violación del principio de sustitución de liskov
- 4. C# clase no implementa heredó miembro abstracta
- 5. Liskov SUSTITUCIÓN y Composición
- 6. ¿Deberían los constructores cumplir con el Principio de Sustitución de Liskov?
- 7. ¿Puedes explicar el Principio de Sustitución de Liskov con un buen ejemplo de C#?
- 8. del principio de sustitución de liskov - Cómo modelar cuadrado y del rectángulo
- 9. ¿Derivar cuadrado del rectángulo es una violación del Principio de Sustitución de Liskov?
- 10. La jerarquía viola a Liskov, ¿y qué?
- 11. Derivar clase abstracta de la clase no abstracta
- 12. ¿El compilador de C# se queja de que la clase abstracta no implementa la interfaz?
- 13. clase concreta de la clase abstracta
- 14. UIScrollView: rollos de tomas individuales que al principio de la
- 15. Comportamiento del miembro protegido una vez que se heredó.
- 16. Clases de casos que heredan de la clase abstracta
- 17. Cortar al principio/al final de la línea, pegar al final/principio de la línea
- 18. ¿Se aplica YAGNI al diseño de la base de datos?
- 19. Unidad probando una clase que hereda de una clase abstracta
- 20. Modelo MVC 3 Cómo vincular un subtipo (clase o interfaz abstracta)
- 21. C++ error de parámetro clase abstracta solución
- 22. Heredó algunos malos genéricos de Java
- 23. Heredar variable estática de la clase abstracta
- 24. ¿Inicializar las variables miembro al principio de la definición de la clase o en el constructor?
- 25. php clase abstracta extendiendo otra clase abstracta
- 26. NHibernate DuplicateMappingException al mapear la clase abstracta y la subclase
- 27. ¿La curva de bañera se aplica al software moderno?
- 28. datepicker se aplica al campo incorrecto
- 29. serialización de una clase abstracta
- 30. Anexar al principio de la lista