No contexto da linguagem C#, considere o código a seguir. na...

Próximas questões
Com base no mesmo assunto
Q1933757 Programação
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 é:
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Resposta Correta: D

Esta questão aborda o conceito de herança e métodos abstratos na linguagem de programação C#. No código fornecido, C1 é uma classe abstrata com um método abstrato denominado M1() e um método concreto denominado M2(). A classe abstrata serve como um modelo para outras classes que derivam dela. Para uma classe ser considerada concreta e instanciável, ela deve implementar todos os métodos abstratos definidos na classe abstrata mãe.

A alternativa correta, a alternativa D, demonstra corretamente a implementação de uma classe derivada, nomeada C2, que herda da classe abstrata C1. A classe C2 fornece uma implementação concreta para o método abstrato M1(), conforme exigido pela definição de uma classe abstrata que contém métodos abstratos. Não é necessário nem possível usar override no método M2(), pois ele não é abstrato na classe base C1.

Segue a estrutura de código que substitui corretamente o tracejado:

<div style="color: blue; font-weight: bold;">class C2 : C1
{
    public override void M1()
    {
        // Implementação do método M1
    }
}</div>

Portanto, a alternativa D está correta porque segue as regras de herança em C# e fornece a implementação obrigatória do método abstrato M1() da classe base abstrata C1, transformando C2 em uma classe concreta que pode ser instanciada e utilizada no método Main.

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

não pesquisei sobre o assunto e não sei nada de C# kkk.

Mas pela intuição e se você souber um pouco de Java , da para responder.

A questão trata sobre herança

No Java , para herdar uma classe , a gente usa

class X extends class Y

ou seja

classe X herda da classe Y

A classe herdada vem antes da classe mãe, assim como na questão

C1:C2

essa eu chutei e foi gol kkk

trata de heranca, como o metodo m2 ja esta implementado, o abstract obriga implementar m1.

A classe C2 herda de C1 então ela precisa sobrescrever o método M1 que é abstrato.

Vamos analisar o código passo a passo.

O código fornecido:

```csharp

namespace NS

  abstract class C1

  { 

    public abstract void M1();

    public void M2()

    { 

      . . . . 

    }

  }

}

```

E depois:

```csharp

class P

  static void Main(string[] args)

  {

    C2 x = new C2();

    x.M1();

    x.M2();

  }

}

```

---

**Observações:**

1. `C1` é **abstract** e tem um método **abstract** `M1()`.

2. `C1` também tem um método **não abstract** `M2()` com implementação.

3. No `Main`, criamos um objeto da classe `C2` e chamamos `M1()` e `M2()`.

4. Portanto, `C2` deve herdar de `C1` e **fornecer uma implementação concreta** para `M1()`.

---

**Regras:**

- Métodos `abstract` devem ser `override` na classe derivada.

- `M2` não é abstract, então não precisa ser sobrescrito (a menos que queira, mas não é obrigatório).

---

Analisando as alternativas:

**A** `public override void M2() { . . . . . }`  

- Errado, pois `M2` não é abstract, e isso não define a classe `C2`.

**B** `class C2 : C1 { public override void M2() { . . . . . } }`  

- Errado, pois `M2` não pode ser `override` a menos que seja `virtual` ou `abstract` em `C1`.

**C** `class C1 : C2 { public override void M1() { . . . . . } }`  

- Errado, pois inverte a herança: `C1` é a base, não pode herdar de `C2`.

**D** `class C2 : C1 { public override void M1() { . . . . } }`  

- Correto: `C2` herda de `C1` e faz `override` do método `M1()` abstrato.

**E** `class C1 : C2 { public override void M2() { . . . . . } }`  

- Errado, mesma inversão de herança que C.

---

**Resposta correta: D**

Clique para visualizar este comentário

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