Você está na página 1de 2

PRINCPIO DA SUBSTITUIO DE LISKOV

O princpio da substituio de Liskov implica que, se existe um mtodo m(x) na classe base de uma hierarquia, ento deve ser possvel invocar m(q) para qualquer classe inferior na mesma hierarquia. um pouco difcil imaginar uma violao dessse princpio usando da linguagem Java. Ele implica que o mtodo na classe derivada possa retornar um valor diferente do esperado pela classe superior. Um exemplo seria o seguinte:

A classe base da hierarquia a classe A', que define o mtodo m(), com valor de retorno Integer. Suponha que essa classe usada por outra classe - Liskov, com o seguinte cdigo:
public class Liskov { private static A a; private static int v; public static void main(String[] args) { a = new A(); v = adicionar(a, 1); a = new C(); v = adicionar(a, 1); a = new B(); v = adicionar(a, 1); //OPS!! ERRO!

} private static int adicionar(A base, int valor) { return base.m() + valor; }

A classe Liskov contm dois mtodos: o principal percorre a hierarquia de classes, e para cada classe chma o mtodo adicionar(). Esse mtodo adiciona determinada constante ao valor de retorno do mtodo m(). O mtodo m() definido na classe base da hierarquia (A), e alterado em B e C. O mtodo adicionar() adiciona os dois valores e retorna a soma. Rodando o programa, observa-se que a ltima sequncia, marcada com ERRO!!, provoca o lanamento de uma exceo inesperada NullPointerException. Isso indica uma violao do LSP: um mtodo m() da subclasse C no pode ser chamado corretamente no lugar do mesmo mtodo da superclasse A. Ao retornar NULL, a classe C violou o LSP, na medida em que a especificao da classe A no previa essa possibilidade. Outro exemplo do LSP corresponde ao caso em que o sistema espera uma certa gama de valores por exemplo, nmeros positivos ou negativos, mas no zero e uma classe recm introduzida na hierarquia despreza essa especificao, levando a um comportamento inesperado do sistema. A introduo de uma nova classe numa dada hierarquia, quando se conhecem todos os usos das classes j existentes tarefa relativamente simples. Agora duponha que temos uma superclasse A, com especializao em B e C. Se desejo criar uma nova classe D, o que devo fazer?

Você também pode gostar