O Princípio de Substituição de Liskov também se aplica a classes que implementam uma interface?

17

O LSP afirma que as classes devem ser substituíveis por suas classes base, o que significa que as classes derivada e base devem ser semanticamente equivalentes.

Mas o LSP também se aplica a classes que implementam uma interface? Em outras palavras, se um método de interface implementado por uma classe é semanticamente diferente do que o usuário espera que seja, isso seria considerado uma violação do LSP?

user1483278
fonte
7
Sim. Exatamente as mesmas razões e resultados que violam o LSP se for uma interface, uma classe abstrata, uma classe completa, não importa. O LSP trata de definir e atender às expectativas para permitir que os consumidores tratem seus tipos de maneira geral.
Jimmy Hoffa
5
De um modo geral (conheço as diferenças, mas estou generalizando aqui), as interfaces são um tanto análogas às classes abstratas puras (termo C ++) e, portanto, Liskov deve aplicar-se às interfaces e às classes que as implementam.
Jesse C. Slicer
3
Nota: a formulação do LSP com que estou familiarizado fala de subtipos, em vez de classes derivada e base. Por uma boa razão, presumo, porque nenhuma das razões é específica da herança e se aplica igualmente a qualquer outro tipo de subtipo.

Respostas:

17

se um método de interface implementado por uma classe for semanticamente diferente do que o usuário espera que seja, isso seria considerado uma violação do LSP?

Se a implementação for semanticamente diferente do comportamento documentado através dos invariantes da interface e de pré e pós-condições de seus métodos, a resposta será "sim", isso seria uma violação do LSP. O princípio estabelece as regras para a abstração e suas implementações, sem exigir que o lado da abstração esteja presente na forma de uma classe.

No entanto, se falarmos sobre o que os usuários esperam , a resposta seria "não necessariamente": os usuários têm direito a ter expectativas erradas.

dasblinkenlight
fonte
"Se a implementação for semanticamente diferente do comportamento documentado através dos invariantes da interface", você poderia elaborar o que você quer dizer com "invariantes da interface"?
user1483278
3
@ user1483278 Aqui está um artigo sobre invariantes de tipo . O artigo os chama de "invariantes de classe", mas a descrição também se aplica a interfaces. Invariantes são condições estabelecidas na construção e mantidas durante toda a vida útil de uma instância. Por exemplo, se uma interface possui uma propriedade Nameque não pode ser configurada null, então obj.Name != nullé considerado invariante dessa interface.
dasblinkenlight
1
Normalmente, quando os invariantes são discutidos, é possível escrever um pedaço de código para verificar se o invariante é mantido ao longo de toda a vida útil do objeto. No entanto, geralmente é mais simples descrever verbalmente o invariante no inglês comum.
Rwong 23/10/12