2010-02-12 43 views
10

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

5

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.

1

Sí, porque una persona que llama puede hacer siempre esto:

BaseAbstractClass instance = new DerivedClass(); 
0

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.

0

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.

Cuestiones relacionadas