Em um jogo de estratégia online, você tem diferentes classes...

Próximas questões
Com base no mesmo assunto
Q3056107 Programação
Em um jogo de estratégia online, você tem diferentes classes de personagens, como "Guerreiro" e "Mago", que herdam de uma classe base chamada "Personagem". A classe base possui um método chamado "ExecutarHabilidade", que funciona de maneira diferente quando chamado por um personagem guerreiro em comparação com um personagem mago.
Considerando princípios de programação orientada a objetos, assinale a abordagem mais adequada para implementar essa diferenciação.
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

A alternativa correta para esta questão é a C.

Vamos agora explicar por que a alternativa C é a correta e analisar as outras opções.

Programação Orientada a Objetos (POO) é um paradigma de programação que utiliza "objetos" – que podem conter dados, na forma de campos, e código, na forma de procedimentos – para projetar aplicativos e programas de computador. Um dos princípios fundamentais da POO é o polimorfismo, que permite que métodos de classes derivadas tenham implementações diferentes das classes base. Isso é essencial para flexibilizar o comportamento dos objetos em uma hierarquia de classes, como a apresentada na questão.

Alternativa C: Marcar o método "ExecutarHabilidade" como virtual na classe base "Personagem" e fornecer implementações específicas nas classes derivadas. Isso é um exemplo clássico de polimorfismo. Ao tornar o método virtual, permitimos que as classes derivadas, como "Guerreiro" e "Mago", forneçam suas próprias implementações para "ExecutarHabilidade". Essa abordagem respeita o design orientado a objetos, promovendo a reutilização de código e a extensibilidade.

Alternativa A: Utilizar variáveis de controle condicional dentro do método "ExecutarHabilidade" para verificar explicitamente o tipo da instância. Esta abordagem é menos eficiente e vai contra os princípios da POO, pois envolve o uso de verificações de tipo (como no caso de type casting ou instanceof), o que pode tornar o código mais difícil de manter e entender. Ela não aproveita os benefícios do polimorfismo.

Alternativa B: Criar versões específicas do método para cada classe. Embora funcione, não utiliza o mecanismo de polimorfismo de forma adequada, pois requer repetição de código entre as classes, o que não é ideal em POO.

Alternativa D: Permitir que "Guerreiro" e "Mago" herdem métodos específicos de diferentes classes. Esta alternativa pode levar a uma complexidade desnecessária e contraria a simplicidade e clareza do polimorfismo, já que não trata diretamente da questão de "ExecutarHabilidade".

Alternativa E: Ocultar a implementação na classe base e redefini-lo nas derivadas. Isso descreve mais o conceito de sombreamento ou esconder (hiding), que não é a prática ideal quando queremos diferentes implementações de um mesmo método. Novamente, o polimorfismo é a solução mais limpa e eficaz para essa situação.

Em suma, a alternativa C é a que melhor aplica os conceitos de polimorfismo em POO, permitindo que cada classe derivada tenha seu comportamento específico para o método "ExecutarHabilidade".

Gostou do comentário? Deixe sua avaliação aqui embaixo!

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

A alternativa mais adequada, considerando os princípios de programação orientada a objetos (POO), é:

C. Marcar o método "ExecutarHabilidade" como virtual na classe base "Personagem" e fornecer implementações específicas nas classes derivadas.

  • A abordagem C utiliza polimorfismo, um dos pilares da POO. Ao marcar o método como na classe base, ele permite que as classes derivadas (como "Guerreiro" e "Mago") sobrescrevam o comportamento padrão, fornecendo implementações específicas. Isso resulta em um código mais limpo, extensível e fácil de manter.
  • A. Essa abordagem viola o princípio de substituição de Liskov e resulta em código acoplado e difícil de manter. Verificar o tipo explicitamente com condicionais ( ou ) contradiz os benefícios do polimorfismo.
  • B. Embora forneça implementações específicas, essa alternativa não utiliza o conceito de sobrescrita do método. Sem o uso do modificador ou , o método na classe base não poderá ser invocado corretamente, e o comportamento esperado pode não ser garantido.
  • D. Essa abordagem sugere herança múltipla, o que não é nativamente suportado em muitas linguagens, como Java e C#. Além disso, complexifica a hierarquia desnecessariamente.
  • E. "Ocultar" a implementação pode indicar o uso do modificador (em C#), o que é considerado uma má prática em design orientado a objetos, pois dificulta a previsibilidade do comportamento ao usar referências do tipo base.

Assim, a alternativa C é a escolha mais alinhada com boas práticas de design orientado a objetos.

gepeto

Justificativa para (C):

  • Marcando o método como virtual na classe base "Personagem", você permite que classes derivadas, como "Guerreiro" e "Mago", substituam (override) o método com suas implementações específicas.
  • Isso promove extensibilidade e evita a necessidade de verificações explícitas de tipo (evitando violações do princípio aberto/fechado da POO).

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo