Questão nº 55
Questão de Informática · FGV TJTO 2022 (nº 55)
No contexto da linguagem C#, considere o código a seguir.
```
namespace NS
{ abstract class C1
{ public abstract void M1();
public void M2()
{
. . . .
}}
class P
{ static void Main(string[] args)
{
C2 x = new C2();
x.M1();
x.M2();
}}}
```
A estrutura de código que substitui corretamente o tracejado é:
- A`public override void M2() { . . . . . }`
- B`class C2 : C1 { public override void M2() { . . . . . }}`
- C`class C1 : C2 { public override void M1() { . . . . . }}`
- D`class C2 : C1 { public override void M1() { . . . . }}` (alternativa correta)
- E`class C1 : C2 { public override void M2() { . . . . . }}`
Resposta comentada
Gabarito Alternativa D
Em C#, uma classe abstrata é um modelo que pode ter métodos sem implementação (chamados métodos abstratos). Qualquer classe que herda de uma classe abstrata e não é abstrata ela mesma (ou seja, é uma classe concreta) precisa obrigatoriamente fornecer uma implementação para todos os métodos abstratos da classe pai, usando a palavra-chave `override`.
(A) Incorreta: Esta alternativa é apenas a definição de um método, não de uma classe. Além disso, a implementação de `M1` é obrigatória para `C2` ser concreta, e esta alternativa não a inclui.
(B) Incorreta: Esta alternativa define `C2` herdando de `C1` e sobrescreve `M2`. No entanto, ela não implementa o método abstrato `M1`, que é obrigatório para que `C2` possa ser instanciada (como em `new C2()`). Se `M1` não fosse implementado, `C2` também teria que ser uma classe abstrata, o que impediria sua instanciação. Armadilha da banca: O distrator tenta te levar a pensar que, como `M2` é chamado, ele precisa ser sobrescrito, mas a prioridade é a implementação do método `abstract`.
(C) Incorreta: Esta alternativa tenta redefinir a classe `C1` e fazê-la herdar de `C2`, o que é um fluxo de herança invertido e incorreto para o problema. `C1` já está definida como uma classe abstrata.
(D) Correta: Esta alternativa define corretamente a classe `C2` herdando de `C1` (`class C2 : C1`). Mais importante, ela fornece a implementação obrigatória para o método abstrato `M1` de `C1` usando `public override void M1() { . . . . }`. O método `M2` é herdado diretamente de `C1` (já que não é abstrato e não precisa ser sobrescrito), permitindo que `C2` seja uma classe concreta e instanciável, cumprindo todos os requisitos do código `Main`.
(E) Incorreta: Similar à alternativa C, esta tenta redefinir `C1` e fazê-la herdar de `C2`, o que é conceitualmente errado. `C1` já possui uma implementação para `M2`, então não faria sentido sobrescrevê-lo dentro da própria `C1` dessa forma.
Fonte: FGV TJTO 2022 Técnico Judiciário - Informática (Caderno Tipo 1). Reproduzida para fins de estudo.