Inspirado por esta resposta:
O princípio da substituição de Liskov exige que
- As pré-condições não podem ser reforçadas em um subtipo.
- As pós-condições não podem ser enfraquecidas em um subtipo.
- Invariantes do supertipo devem ser preservados em um subtipo.
- Restrição do histórico (a "regra do histórico"). Os objetos são considerados modificáveis apenas por meio de seus métodos (encapsulamento). Como os subtipos podem introduzir métodos que não estão presentes no supertipo, a introdução desses métodos pode permitir alterações de estado no subtipo que não são permitidas no supertipo. A restrição de história proíbe isso.
Eu esperava que alguém publicasse uma hierarquia de classes que viole esses 4 pontos e como resolvê-los adequadamente.
Estou procurando uma explicação elaborada para fins educacionais sobre como identificar cada um dos 4 pontos na hierarquia e a melhor maneira de corrigi-lo.
Nota:
Eu esperava publicar um exemplo de código para as pessoas trabalharem, mas a pergunta em si é sobre como identificar as hierarquias defeituosas :)