Polimorfismo em Python
Gabarito: letra D. O princípio da orientação a objetos utilizado no programa, especialmente em relação ao método acao, é o polimorfismo, pois o mesmo método (acao) é sobrescrito em classes diferentes, produzindo comportamentos distintos ("corre" e "voa"). O polimorfismo permite que objetos de classes diferentes respondam à mesma mensagem de maneiras diferentes, e é exatamente isso que o código demonstra.
O polimorfismo é um dos quatro pilares da programação orientada a objetos (POO), ao lado da abstração, encapsulamento e herança. Ele se manifesta de duas formas principais: estático (sobrecarga) e dinâmico (sobrescrita). O polimorfismo estático ocorre quando uma classe define múltiplos métodos com o mesmo nome, mas com assinaturas diferentes (diferentes parâmetros). Já o polimorfismo dinâmico ocorre quando uma subclasse fornece uma implementação específica de um método já definido em sua superclasse, ou seja, quando há sobrescrita (override) de métodos. É essa segunda forma que o código da questão exemplifica: classes diferentes (provavelmente subclasses de uma mesma superclasse) implementam o método acao de maneiras distintas, e ao chamar esse método em objetos dessas classes, obtêm-se resultados diferentes.
Na prática, o polimorfismo é o que permite escrever código que trata objetos de forma genérica, sem precisar saber exatamente qual é a classe concreta do objeto em tempo de compilação. Por exemplo, se temos uma lista de objetos de diferentes subclasses, podemos iterar sobre ela e chamar o método acao em cada um, e cada objeto executará sua própria versão do método. Isso promove a extensibilidade e a reutilização de código, pois novas classes podem ser adicionadas sem alterar o código que as utiliza.
A pegadinha da questão está em confundir polimorfismo com outros pilares da POO. A abstração é o processo de modelar objetos do mundo real, focando apenas nas características relevantes para o sistema. O encapsulamento é o mecanismo de esconder os detalhes internos de uma classe, protegendo seus atributos e métodos. A herança é o mecanismo que permite que uma classe herde atributos e métodos de outra, promovendo o reuso de código. A recursividade não é um princípio da POO, mas sim uma técnica de programação em que uma função chama a si mesma. O polimorfismo, por sua vez, é a capacidade de um mesmo método se comportar de formas diferentes em classes diferentes, que é exatamente o que o código demonstra.
Guarde a distinção central: enquanto a herança é o mecanismo que permite o reuso de código e a criação de hierarquias, o polimorfismo é a capacidade de usar essa hierarquia para que objetos de classes diferentes respondam à mesma mensagem de maneiras diferentes. É essa capacidade que o código da questão explora.
Alternativa A — ❌ Incorreta
A abstração é o pilar da POO que consiste em modelar objetos do mundo real, focando apenas nas características essenciais para o sistema, ignorando detalhes irrelevantes. No código, o método acao não está sendo usado para abstrair características de um objeto, mas sim para demonstrar que o mesmo método pode ter comportamentos diferentes em classes diferentes. A abstração é um conceito mais amplo, relacionado à modelagem, e não à execução de um método com comportamentos distintos.
Alternativa B — ❌ Incorreta
O encapsulamento é o mecanismo que esconde os detalhes internos de uma classe, protegendo seus atributos e métodos, geralmente por meio de modificadores de acesso (como private e public). No código, não há evidência de que o método acao esteja encapsulado ou que haja proteção de atributos. O foco da questão é o comportamento do método em diferentes classes, o que caracteriza o polimorfismo, não o encapsulamento.
Alternativa C — ❌ Incorreta
A herança é o mecanismo que permite que uma classe herde atributos e métodos de outra, promovendo o reuso de código. Embora o polimorfismo dinâmico (sobrescrita) dependa da herança para existir, a questão pergunta especificamente sobre o princípio utilizado "especialmente em relação ao método acao". O que está em destaque é o fato de o mesmo método se comportar de formas diferentes, o que é a essência do polimorfismo, e não a herança em si. A herança é o meio, o polimorfismo é o fim.
Alternativa D — ✅ Correta ⟵ GABARITO
O polimorfismo é o princípio da POO que permite que objetos de classes diferentes respondam à mesma mensagem (chamada de método) de maneiras diferentes. No código, o método acao é sobrescrito em classes diferentes, produzindo saídas distintas ("corre" e "voa"). Isso é um exemplo clássico de polimorfismo dinâmico, também conhecido como sobrescrita (override). O polimorfismo é o que permite tratar objetos de forma genérica, chamando o mesmo método e obtendo comportamentos específicos de cada classe.
Alternativa E — ❌ Incorreta
A recursividade é uma técnica de programação em que uma função chama a si mesma, direta ou indiretamente, para resolver um problema dividindo-o em subproblemas menores. Não é um princípio da orientação a objetos, e o código da questão não apresenta nenhuma chamada recursiva. A recursividade é um conceito de algoritmos e estruturas de dados, não um pilar da POO.
Gabarito: letra D — o princípio utilizado é o polimorfismo, pois o método acao se comporta de formas diferentes em classes diferentes.