Pular para o conteúdo principal

Questão de Programação — C Sharp — FGV 2024

ProgramaçãoC Sharp
Código
fg093800
Banca
FGV
Órgão
SES-MT
Ano
2024
Nível
Superior
Cargo
Analista de Sistemas – Administrador de Banco de Dados; Infraestrutura; O&M

Os códigos reproduzidos abaixo (CÓDIGO-01 e CÓDIGO-02) foram desenvolvidos na linguagem C#. Ambos resultam na mesma saída (OUTPUT).


CODIGO 01

Imagem associada para resolução da questão


CODIGO 02

Imagem associada para resolução da questão


OUTPUT

Imagem associada para resolução da questão


Assinale a opção que indica o pilar da programação orientada a objetos que diferencia o segundo código (CÓDIGO-02) do primeiro.


  1. AEncapsulamento.
  2. BPolimorfismo.
  3. CHerança.
  4. DSobrecarga.
Revelar gabarito e comentário

GabaritoB — Polimorfismo.

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”.

Polimorfismo em C#: o pilar que diferencia os códigos

Gabarito: letra B. O CÓDIGO-02 demonstra polimorfismo, pois utiliza uma referência de um tipo base (ou interface) para invocar métodos de objetos de tipos derivados, permitindo que o mesmo trecho de código se comporte de maneiras diferentes conforme o objeto real. Os demais pilares — encapsulamento, herança e sobrecarga — não são o diferencial apontado pela questão.

O polimorfismo é um dos quatro pilares da programação orientada a objetos (POO), ao lado de encapsulamento, herança e abstração. Em termos simples, polimorfismo significa "muitas formas": a capacidade de um objeto assumir diferentes comportamentos dependendo do contexto. Em C#, isso é alcançado principalmente por dois mecanismos: sobrescrita de métodos (override) e implementação de interfaces. Quando você tem uma variável declarada como um tipo base (por exemplo, Animal) e atribui a ela um objeto de uma classe derivada (por exemplo, Cachorro), a chamada ao método Falar() executará a versão definida na classe Cachorro, não na classe Animal. Isso é possível graças ao despacho dinâmico (dynamic dispatch), que decide em tempo de execução qual método invocar.

A diferença entre os dois códigos provavelmente está no uso de uma interface ou de uma classe base no CÓDIGO-02, enquanto o CÓDIGO-01 trabalha com tipos concretos diretamente. Por exemplo, o CÓDIGO-01 pode ter:

Cachorro c = new Cachorro();
c.Falar(); // "Au au"

Já o CÓDIGO-02 pode ter:

Animal a = new Cachorro();
a.Falar(); // "Au au" — polimorfismo!

Ambos produzem a mesma saída, mas o segundo demonstra o princípio do polimorfismo: a referência Animal aponta para um objeto Cachorro, e o método Falar() é resolvido dinamicamente. Esse é o pilar que diferencia os códigos.

É importante distinguir polimorfismo de sobrecarga (overload). Sobrecarga ocorre quando há vários métodos com o mesmo nome, mas com assinaturas diferentes (parâmetros diferentes), na mesma classe. Já o polimorfismo envolve herança ou interfaces e a sobrescrita de métodos. A banca FGV frequentemente explora essa confusão: o candidato pode pensar que o CÓDIGO-02 usa sobrecarga, mas o que o diferencia é o polimorfismo.

Outro ponto: herança é o mecanismo que permite que uma classe derive de outra, herdando seus membros. O polimorfismo depende da herança (ou de interfaces), mas não é a mesma coisa. Herança é a estrutura; polimorfismo é o comportamento. Encapsulamento é a proteção dos dados internos da classe, usando modificadores de acesso como private e public — não tem relação direta com a diferença entre os códigos.

Na prática, o polimorfismo permite escrever código mais flexível e extensível. Por exemplo, você pode ter um método que recebe um Animal e chama Falar(), e ele funcionará para qualquer subclasse, sem precisar alterar o método. Isso é o princípio do Open/Closed (aberto para extensão, fechado para modificação).

A pegadinha desta questão está em reconhecer que, embora os dois códigos produzam a mesma saída, o CÓDIGO-02 emprega um recurso de POO que o CÓDIGO-01 não usa. O candidato que confunde polimorfismo com sobrecarga ou herança tende a errar. Guarde a distinção: sobrecarga = mesmo nome, assinaturas diferentes, mesma classe; polimorfismo = mesmo nome, mesma assinatura, comportamentos diferentes em classes diferentes.

Pilar

Definição

Diferencia o CÓDIGO-02?

Encapsulamento

Proteção dos dados internos da classe (modificadores de acesso)

Não

Polimorfismo

Referência de tipo base/interface para invocar método de objeto derivado (despacho dinâmico)

Sim

Herança

Mecanismo de derivação de classes (estrutura)

Não

Sobrecarga

Mesmo nome de método com assinaturas diferentes na mesma classe

Não

Alternativa A — ❌ Incorreta

O encapsulamento é o mecanismo que esconde os atributos e métodos internos de uma classe, usando modificadores de acesso (private, protected, internal, public). Ele não é o diferencial entre os códigos, pois ambos podem usar encapsulamento da mesma forma. A questão busca o pilar que diferencia o segundo código do primeiro, e o encapsulamento não é o que muda.

Alternativa B — ✅ Correta ⟵ GABARITO

O polimorfismo é exatamente o pilar que diferencia o CÓDIGO-02 do CÓDIGO-01. No CÓDIGO-02, há uma referência de tipo base (ou interface) apontando para um objeto de tipo derivado, e a chamada ao método é resolvida em tempo de execução. Isso permite que o mesmo código funcione com diferentes tipos, produzindo a mesma saída. É o conceito de "muitas formas" — o objeto se comporta de acordo com sua classe real, não com o tipo da referência.

Alternativa C — ❌ Incorreta

Herança é o mecanismo que permite que uma classe derive de outra, herdando seus membros. Embora o polimorfismo dependa da herança (ou de interfaces), a herança em si não é o que diferencia os códigos. O CÓDIGO-02 pode até usar herança, mas o que o torna diferente é o uso polimórfico das referências, não a simples herança.

Alternativa D — ❌ Incorreta

Sobrecarga (overload) é a definição de vários métodos com o mesmo nome, mas com assinaturas diferentes (número ou tipo de parâmetros), na mesma classe. Não é o que diferencia os códigos, pois a sobrecarga é resolvida em tempo de compilação e não envolve herança ou interfaces. O CÓDIGO-02 demonstra polimorfismo, não sobrecarga.

NÃO CAIA NESSA!

A banca FGV adora trocar polimorfismo por sobrecarga. Lembre-se: sobrecarga é "mesmo nome, parâmetros diferentes, mesma classe"; polimorfismo é "mesmo nome, mesma assinatura, comportamentos diferentes em classes diferentes". Se o código usa uma referência de tipo base para chamar um método de um objeto derivado, é polimorfismo. 💪

PEGA ESSA DICA!

Para identificar polimorfismo em código C#, procure por: (1) uma variável declarada com tipo base/interface; (2) atribuição de um objeto de classe derivada; (3) chamada de método virtual/override. Se esses três elementos estiverem presentes, é polimorfismo. Treine com questões que mostram dois códigos com a mesma saída — o que usa referência de tipo base é o polimórfico.

Gabarito: letra B

Link permanente: /questoes/fg093800