← Questões de Programação

Programação · FGV · 2022

Questão comentada de 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 é:

Gabarito: D

Em C#, uma classe abstrata funciona como um molde: voce nao instancia a classe abstrata diretamente, mas pode criar classes derivadas que implementem o que ela exigiu. Quando a classe base declara um metodo abstrato, a classe filha obrigatoriamente deve sobrescreve-lo com override, desde que tambem seja concreta. Ja os metodos comuns da classe base ja vem prontos e podem ser herdados normalmente. No enunciado, C1 tem um metodo abstrato M1() e um metodo concreto M2(). Isso significa que a classe C2, para poder ser instanciada com new C2(), precisa herdar de C1 e implementar M1(). Sem isso, C2 continuaria abstrata e nao poderia ser criada no Main. Por isso o trecho correto eh `class C2 : C1 { public override void M1() { ... } }`. A classe C2 herda M2() de C1 sem precisar reescreve-lo, e o objeto x consegue chamar tanto x.M1() quanto x.M2(). Esse eh um ponto bem classico de C#: metodo abstrato obriga override; metodo concreto da base pode ser usado direto. Em resumo: a banca quer testar se voce entende que uma classe derivada concreta deve implementar todos os membros abstratos da superclasse. Se faltar isso, o codigo nao compila. Aqui, o gabarito D esta correto porque ele cria C2 como filha de C1 e sobrescreve exatamente o metodo abstrato M1().

Continue treinando

Questões relacionadas