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
Veiculodeve serabstractcom métodoabstract Descricao().CarroeMotodevem herdar deVeiculoe implementarDescricao.CarroEletricodeve herdar deCarro, sobrescreverDescricaoe sersealed.- 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
Veiculoé uma classe abstrata com propriedades comuns e um método abstratoDescricao.Carroherda e implementaDescricaoretornando uma string formatada.Motofaz o mesmo, mas com o texto "Moto".CarroEletricoherda deCarro, adiciona a propriedadeAutonomiae sobrescreveDescricaopara incluir essa informação.- A palavra-chave
sealedimpede que outras classes herdem deCarroEletrico. - No
Main, criamos uma lista deVeiculoe chamamosDescricaopolimorficamente. - 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 : CarroEletricogera erro de compilação porque a classe é selada. - Esquecer de sobrescrever
DescricaoemCarroEletrico: o método deCarroseria usado, perdendo a autonomia. - Não marcar
Descricaocomooverridena 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