Desafio C#

Veículos e classes seladas

Enunciado

Modele uma hierarquia de veículos: uma classe abstrata Veiculo com propriedades Marca e Modelo, e um método abstrato Descricao(). Crie as classes Carro e Moto que herdam de Veiculo e implementam Descricao. Depois, crie uma classe CarroEletrico que herda de Carro e sobrescreve Descricao para incluir a autonomia da bateria. Torne CarroEletrico selada (sealed) para que não possa ser herdada. No Main, crie uma lista de Veiculo e exiba a descrição de cada um.

Requisitos

  • Veiculo deve ser abstract com método abstract Descricao().
  • Carro e Moto devem herdar de Veiculo e implementar Descricao.
  • CarroEletrico deve herdar de Carro, sobrescrever Descricao e ser sealed.
  • O programa deve exibir as descrições de todos os veículos.

Código inicial

using System;
using System.Collections.Generic;

abstract class Veiculo
{
    public string Marca { get; set; }
    public string Modelo { get; set; }
    // TODO: método abstrato Descricao
}

class Carro : Veiculo
{
    // TODO: implementar Descricao
}

class Moto : Veiculo
{
    // TODO: implementar Descricao
}

// TODO: criar CarroEletrico selado herdando de Carro

class Program
{
    static void Main()
    {
        // TODO: criar lista e exibir descrições
    }
}

Saída esperada

Carro: Toyota Corolla
Moto: Honda CG 160
Carro Elétrico: Tesla Model 3 - Autonomia: 500 km
Ver dica

Use sealed antes de class para impedir herança. Lembre-se de que CarroEletrico pode acessar membros públicos de Carro.

Mostrar solução
using System;
using System.Collections.Generic;

abstract class Veiculo
{
    public string Marca { get; set; }
    public string Modelo { get; set; }

    // Método abstrato: cada veículo deve fornecer sua descrição
    public abstract string Descricao();
}

class Carro : Veiculo
{
    public override string Descricao() => $"Carro: {Marca} {Modelo}";
}

class Moto : Veiculo
{
    public override string Descricao() => $"Moto: {Marca} {Modelo}";
}

// Classe selada: não pode ser herdada
sealed class CarroEletrico : Carro
{
    public int Autonomia { get; set; }

    public override string Descricao() => $"Carro Elétrico: {Marca} {Modelo} - Autonomia: {Autonomia} km";
}

class Program
{
    static void Main()
    {
        var veiculos = new List<Veiculo>
        {
            new Carro { Marca = "Toyota", Modelo = "Corolla" },
            new Moto { Marca = "Honda", Modelo = "CG 160" },
            new CarroEletrico { Marca = "Tesla", Modelo = "Model 3", Autonomia = 500 }
        };

        foreach (var v in veiculos)
        {
            Console.WriteLine(v.Descricao());
        }
    }
}

Passo a passo

  1. Veiculo é uma classe abstrata com propriedades comuns e um método abstrato Descricao.
  2. Carro herda e implementa Descricao retornando uma string formatada.
  3. Moto faz o mesmo, mas com o texto "Moto".
  4. CarroEletrico herda de Carro, adiciona a propriedade Autonomia e sobrescreve Descricao para incluir essa informação.
  5. A palavra-chave sealed impede que outras classes herdem de CarroEletrico.
  6. No Main, criamos uma lista de Veiculo e chamamos Descricao polimorficamente.
  7. A saída mostra a descrição específica de cada tipo.

Por que funciona

A herança permite que CarroEletrico reutilize a estrutura de Carro e adicione detalhes. O polimorfismo garante que a chamada a Descricao execute o método correto para cada objeto. O sealed assegura que a classe não seja estendida, o que pode ser útil para evitar alterações indesejadas em comportamentos específicos.

Erros comuns

  • Tentar herdar de CarroEletrico: class Esportivo : CarroEletrico gera erro de compilação porque a classe é selada.
  • Esquecer de sobrescrever Descricao em CarroEletrico: o método de Carro seria usado, perdendo a autonomia.
  • Não marcar Descricao como override na classe derivada: o compilador alerta e o método da base é escondido.

Outra forma de resolver

Poderia usar sealed override em um método para impedir sobrescrita adicional, mas aqui selamos a classe inteira. Em vez de herança, poderia usar composição, mas o exercício pede herança.

Saída esperada

Carro: Toyota Corolla
Moto: Honda CG 160
Carro Elétrico: Tesla Model 3 - Autonomia: 500 km