Na minha busca por escrever um código melhor e mais limpo, estou aprendendo sobre os princípios do SOLID. Nisso, o LSP está se mostrando pouco difícil de entender adequadamente.
Minha dúvida é: se eu tiver alguns métodos extras no meu subtipo, S, que não existiam no tipo, T, isso sempre será uma violação do LSP? Se sim, então como faço para extend
minhas aulas?
Por exemplo, digamos que temos um Bird
tipo. E seus subtipos são Eagle
e Humming Bird
. Agora, ambos os subtipos têm algum comportamento comum como o Bird
. Mas Eagle
também tem um bom comportamento predatório (que não está presente no Bird
tipo geral ), que eu quero usar . Portanto, agora não poderei fazer isso:
Bird bird = new Eagle();
Então, Eagle
esse comportamento extra está quebrando o LSP?
Se sim, isso significa que não posso estender minhas classes porque isso causaria violação do LSP?
class Eagle extends Bird {
//we are extending Bird since Eagle has some extra behavior also
}
A extensão de classes deve ser permitida de acordo com o princípio Aberto / Fechado, certo?
Agradecemos antecipadamente por responder! Como você pode ver claramente, o LSP me confundiu como tudo.
Editar: Consulte esta resposta SO. Nisto novamente, quando Car
tem comportamento adicional como ChangeGear
, viola o LSP. Então, como estendemos uma classe, sem violar o LSP?
fonte
Respostas:
Resposta muito simples: não.
O ponto para o LSP é que ele
S
deve ser substituídoT
. Portanto, seT
implementa umadelete
função, tambémS
deve implementá-la e deve executar uma exclusão quando chamada. No entanto,S
é gratuito adicionar funcionalidades adicionais além do que éT
fornecido. Os consumidores de aT
, ao receberem umS
, não teriam conhecimento dessa funcionalidade extra, mas é permitido que os consumidores deS
utilizem diretamente.Um exemplo altamente artificial de como o princípio pode ser violado pode ser:
Resposta um pouco mais complexa: não, desde que você não comece a afetar o estado ou outro comportamento esperado do tipo base.
Por exemplo, o seguinte seria uma violação:
O tipo
Point2D
,, é imutável; seu estado não pode ser alterado. ComMyPoint2D
, eu deliberadamente contornei esse comportamento para torná-lo mutável. Isso quebra a restrição de históricoPoint2D
e, portanto, é uma violação do LSP.fonte
delete
função que seria uma violação do LSP?Claro que não. Se o objeto Eagle puder ser usado por qualquer código que espere um pássaro ou subclasse e se comporte como um pássaro deve se comportar, você estará bem.
Obviamente, o comportamento da Águia só pode ser usado por código que sabe que é um objeto desse tipo. Esperamos que algum código crie explicitamente um objeto Eagle e o use como objeto Eagle, além de poder usar qualquer código que espere objetos Bird.
fonte