Questão nº 36

Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2024 (nº 36)

CESGRANRIO2024Técnico Científico - Área de Formação: Tecnologia da InformaçãoTecnologia da Informação
Gabarito: Cver comentário ↓

Considere um sistema bancário em Java que possui a classe Cliente e suas subclasses, ClientePessoaFisica e ClientePessoaJuridica, onde Cliente é uma classe abstrata. Nesse sistema, um método getDesconto(valor) deve fornecer o cálculo do desconto para um tipo de cliente, de forma que os clientes do tipo pessoa física e os clientes do tipo pessoa jurídica tenham descontos diferenciados. Suponha que, utilizando corretamente os mecanismos associados à herança e ao polimorfismo, se deseje implementar essas classes de modo que o método getDesconto possa ser aplicado indistintamente a qualquer instância que tenha sido declarada como da classe Cliente.

Para atender a essa condição, a implementação dessas classes deve possuir o método getDesconto

Resposta comentada

Gabarito Alternativa C

Conceito-chave: Em herança com polimorfismo, a classe mãe (abstrata) define o contrato (método que todas as subclasses devem ter), e cada subclasse implementa o método do seu jeito. Assim, você pode chamar getDesconto() em qualquer objeto do tipo Cliente, sem saber se ele é PF ou PJ — o Java decide sozinho qual versão executar.

  • (A) Incorreta: Colocar o cálculo na classe Cliente com if/else para descobrir a subclasse quebra o polimorfismo e acopla a classe mãe aos filhos, além de violar o princípio do aberto/fechado (toda nova subclasse exigiria alterar a mãe).
  • (B) Incorreta: Se o método existir só nas subclasses, você não pode chamá-lo via referência Cliente (o compilador não garante que o método existe), e o polimorfismo não funciona — a classe abstrata precisa declarar o método para o contrato existir.
  • (C) Correta: A classe Cliente declara getDesconto como abstrato (sem corpo), e cada subclasse implementa sua versão. Isso permite chamar o método em qualquer referência Cliente, e o polimorfismo resolve qual versão executar em tempo de execução.
  • (D) Incorreta: Colocar o método fora das classes (ex.: classe utilitária com if/else) é programação procedural, não OO — perde o polimorfismo e obriga a alterar o código a cada novo tipo de cliente.
  • (E) Incorreta: A classe Cliente não deve chamar as versões das subclasses; ela apenas declara o método (abstrato ou com implementação padrão). Quem chama é o código externo, e o polimorfismo faz a seleção automática — a descrição da alternativa descreve um padrão de "template method" invertido, que não é o caso aqui.

Armadilha do distrator mais tentador (B): A banca tenta te enganar com a frase "não há instâncias da classe Cliente, pois é abstrata". Isso é verdade, mas não elimina a necessidade de declarar o método na classe mãe. A classe abstrata existe justamente para definir o contrato — sem o método declarado nela, o polimorfismo não funciona. A pegadinha está em confundir "não pode instanciar" com "não precisa declarar o método".

Fonte: CESGRANRIO BASA 01/2024 Técnico Científico - Área de Formação: Tecnologia da Informação (Caderno Prova B). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho