Questão nº 36
Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2024 (nº 36)
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
- Aapenas na classe Cliente, identificando a qual subclasse o cliente pertence e calculando o desconto por meio de uma estrutura se-então dentro da implementação.
- Bapenas nas classes ClientePessoaFisica e ClientePessoaJuridica, pois não há instâncias da classe Cliente no sistema, já que é uma classe abstrata.
- Cem todas as três classes, sendo possível, nesse caso, que a função getDesconto da classe Cliente seja abstrata. (alternativa correta)
- Dfora das três classes, dado que uma estrutura do tipo se-então deve ser usada para descobrir qual é a classe adequada.
- Eimplementada totalmente em todas as classes, sendo que a função getDesconto da classe Cliente chama a função getDesconto das classes ClientePessoaFisica e ClientePessoaJuridica de acordo com a necessidade.
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
Clientecomif/elsepara 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
ClientedeclaragetDescontocomo abstrato (sem corpo), e cada subclasse implementa sua versão. Isso permite chamar o método em qualquer referênciaCliente, 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
Clientenã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.