Pular para o conteúdo principal

Questão de Programação — Programação Orientada a Objetos — FGV 2024

ProgramaçãoProgramação Orientada a Objetos
Código
fg079735
Banca
FGV
Órgão
DATAPREV
Ano
2024
Nível
Superior
Cargo
ATI - Desenvolvimento de Software
Em um projeto de software utilizando orientação a objetos, foi implementado o seguinte código em Java:Q49.png 397×213Com base no princípio de Substituição de Liskov (L), que faz parte dos princípios SOLID, em relação à implementação do método emitirSom, assinale a opção correta.
  1. AA classe Cachorro não pode sobrescrever o método emitirSom, pois isso viola o princípio da Substituição de Liskov.
  2. BO princípio da Substituição de Liskov é violado porque a classe Cachorro altera o comportamento do método emitirSom herdado de Animal.
  3. CO código está de acordo com o princípio da Substituição de Liskov, já que a classe Cachorro pode ser usada no lugar da classe Animal sem comprometer a corretude do programa.
  4. DO princípio da Substituição de Liskov exige que o método emitirSom de Cachorro seja exatamente igual ao de Animal.
  5. EA implementação fere o princípio da Substituição de Liskov porque o método sobrescrito deve lançar uma exceção quando chamado.
Revelar gabarito e comentário

GabaritoC — O código está de acordo com o princípio da Substituição de Liskov, já que a classe Cachorro pode ser usada no lugar da classe Animal sem comprometer a corretude do programa.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Princípio da Substituição de Liskov (LSP) e a sobrescrita de métodos

Gabarito: letra C. O código está de acordo com o Princípio da Substituição de Liskov (LSP), pois a classe Cachorro, ao sobrescrever o método emitirSom, pode ser usada no lugar da classe Animal sem comprometer a corretude do programa — desde que a sobrescrita mantenha o contrato estabelecido pela superclasse (mesma assinatura, comportamento compatível e sem violar invariantes). O LSP, um dos cinco princípios SOLID, exige que subclasses sejam substituíveis por suas superclasses sem alterar o funcionamento esperado do sistema.

O Princípio da Substituição de Liskov foi formulado por Barbara Liskov em 1987 e estabelece que, se uma classe S é subclasse de T, então objetos do tipo T podem ser substituídos por objetos do tipo S sem quebrar o programa. Em outras palavras, a subclasse deve preservar o contrato da superclasse: não pode enfraquecer pré-condições, não pode fortalecer pós-condições e deve manter as invariantes da classe base. Isso não significa que a subclasse não possa sobrescrever métodos — pelo contrário, a sobrescrita (override) é um mecanismo fundamental do polimorfismo e é perfeitamente compatível com o LSP, desde que a nova implementação respeite o comportamento esperado.

No exemplo típico, temos uma classe Animal com o método emitirSom() e uma subclasse Cachorro que sobrescreve esse método para retornar "Au au". Isso é um uso correto do polimorfismo: quem chama animal.emitirSom() espera que o animal emita algum som, e o Cachorro emite um som específico, mas ainda assim um som. O programa continua correto porque a substituição não altera a semântica esperada — apenas especializa o comportamento.

A pegadinha da banca está em confundir sobrescrita com violação do LSP. Sobrescrever um método não viola o LSP; violar o LSP seria, por exemplo, sobrescrever emitirSom() para lançar uma exceção inesperada, ou para retornar um valor que não faz sentido no contexto da superclasse (como retornar null quando a superclasse promete uma String não nula). A sobrescrita é a base do polimorfismo dinâmico, e o LSP apenas impõe que essa sobrescrita seja comportamentalmente compatível.

Guarde a fronteira: sobrescrever ≠ violar LSP. A violação ocorre quando a subclasse quebra o contrato — por exemplo, alterando o tipo de retorno de forma incompatível, lançando exceções não previstas, ou mudando o comportamento de forma que o código que usa a superclasse deixe de funcionar corretamente. É exatamente nessa fronteira que as alternativas se dividem.

1Exige
Substituibilidade sem quebrar o programa
Manter o contrato da superclasse
Respeitar pré-condições e pós-condições
2Permite
Sobrescrita (override)
Especialização de comportamento
3Viola quando
Quebra o contrato
Lança exceção inesperada
Retorna valor incompatível
LSP (Substituição de Liskov)
LEVELsoulevel.com.br
LSP (Substituição de Liskov): Exige (Substituibilidade sem quebrar o programa, Manter o contrato da superclasse, Respeitar pré-condições e pós-condições); Permite (Sobrescrita (override), Especialização de comportamento); Viola quando (Quebra o contrato, Lança exceção inesperada, Retorna valor incompatível)

Alternativa A — ❌ Incorreta

Afirma que a classe Cachorro não pode sobrescrever o método emitirSom, pois isso violaria o LSP. Isso é falso: a sobrescrita é permitida e incentivada no polimorfismo. O LSP não proíbe sobrescrita; ele apenas exige que a sobrescrita mantenha o contrato da superclasse. A alternativa confunde sobrescrita com violação de contrato.

Alternativa B — ❌ Incorreta

Afirma que o LSP é violado porque a classe Cachorro altera o comportamento do método herdado. Alterar o comportamento (sobrescrever) é exatamente o que o polimorfismo permite. O LSP só é violado se essa alteração quebrar o contrato — por exemplo, se o método passar a lançar uma exceção inesperada ou retornar um valor incompatível. A mera alteração do comportamento, quando compatível com a expectativa da superclasse, está de acordo com o LSP.

Alternativa C — ✅ Correta ⟵ GABARITO

Esta alternativa está correta porque descreve precisamente o LSP: a classe Cachorro pode ser usada no lugar da classe Animal sem comprometer a corretude do programa. Isso é exatamente o que o princípio exige — substituibilidade. A sobrescrita de emitirSom é válida porque mantém o contrato: o método continua emitindo um som, apenas com comportamento específico da subclasse.

Alternativa D — ❌ Incorreta

Afirma que o LSP exige que o método emitirSom de Cachorro seja exatamente igual ao de Animal. Isso é falso: o LSP não exige igualdade de implementação, mas sim compatibilidade de contrato. A subclasse pode (e deve) especializar o comportamento, desde que respeite pré-condições, pós-condições e invariantes da superclasse.

Alternativa E — ❌ Incorreta

Afirma que a implementação fere o LSP porque o método sobrescrito deve lançar uma exceção quando chamado. Isso é o oposto do LSP: lançar uma exceção inesperada é uma violação clássica do princípio, pois quebra o contrato da superclasse. A alternativa inverte completamente o conceito.

NÃO CAIA NESSA!

A banca explora a confusão entre sobrescrita e violação do LSP. Muitos candidatos pensam que qualquer alteração de comportamento na subclasse viola o princípio, mas o LSP permite a sobrescrita desde que o contrato seja mantido. A pegadinha está em alternativas que dizem "não pode sobrescrever" (A), "altera o comportamento = viola" (B) ou "deve lançar exceção" (E) — todas invertem o conceito. Lembre-se: sobrescrever é polimorfismo; violar o LSP é quebrar o contrato.

PEGA ESSA DICA!

Para identificar violação do LSP na prova, pergunte: "a subclasse pode ser usada no lugar da superclasse sem quebrar o programa?" Se sim, está de acordo. Se a subclasse lança exceções inesperadas, retorna valores incompatíveis ou enfraquece garantias, aí sim há violação. Sobrescrita por si só nunca é violação.

Gabarito: letra C

Link permanente: /questoes/fg079735