No contexto da linguagem C#, considere o código a seguir. na...
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 é:
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