Princípio da substituição de Liskov

Barbara Liskov

Na programação orientada a objeto, o princípio da substituição de Liskov é uma definição particular para o conceito de subtipo. Foi introduzido em 1993 por Barbara Liskov e Jeannette Wing através de um artigo de nome Family Values: A Behavioral Notion of Subtyping.[1] Para outra definição de subtipo ver tipo de dado.

O princípio foi definido de forma resumida como:[2]

Se q ( x ) {\displaystyle q(x)} é uma propriedade demonstrável dos objetos x {\displaystyle x} de tipo T {\displaystyle T} . Então q ( y ) {\displaystyle q(y)} deve ser verdadeiro para objetos y {\displaystyle y} de tipo S {\displaystyle S} onde S {\displaystyle S} é um subtipo de T {\displaystyle T} .

Portanto, a visão de "subtipo" defendida por Liskov e Wing é baseada na noção da substituição; isto é, se S é um subtipo de T, então os objetos do tipo T, em um programa, podem ser substituídos pelos objetos de tipo S sem que seja necessário alterar as propriedades deste programa.

Projeto por contrato

O princípio da substituição de Liskov tem um relacionamento próximo com a metodologia do projeto por contrato e coloca restrições na forma como os contratos interagem com o conceito de herança:

  • precondições não podem ser reforçadas em uma sub-classe. Isto significa que não é permitida uma sub-classe com precondições mais fortes que a sua super-classe.
  • condições posteriores não podem ser enfraquecidas em uma sub-classe. Isto significa que não é permitida uma sub-classe que contém condições posteriores mais fracas que a super-classe.

Em adição, o princípio implica que os métodos das sub-classes não podem lançar exceções não lançadas pela super-classe, exceto quando estas exceções são subtipos das exceções lançadas pelos métodos da super-classe. Ver covariância e contravariância.

Uma função, que utiliza uma hierarquia de classes que viola este princípio, precisa de uma referência para a classe base e ainda assim precisa de referências para as sub-classes da classe base. Esta função viola o princípio aberto/fechado pois precisa ser modificada quando uma nova sub-classe é criada.

Referências

  1. Barbara Liskov, Jeannette Wing. «Family Values: A Behavioral Notion of Subtyping» (em inglês). Consultado em 6 de julho de 2007 
  2. Liskov, Barbara; Wing, Jeannette. «Behavioral Subtyping Using Invariants and Constraints» (em inglês). Consultado em 6 de julho de 2007