Herança e Polimorfismo em C#: Veículos, Interfaces e Exceções

Artes plásticas e educação artística74,43 KB

Veículos: Classe Abstrata e Atributos

VEÍCULOS

public abstract class Veiculo
{
    // ATRIBUTOS
    string descricao = "";

    public string Descricao
    {
        get { return descricao; }
        set { descricao = value; }
    }

    double capacidadeMaximaEmKg = 0;

    public double CapacidadeMaximaEmKg
    {
        get { return capacidadeMaximaEmKg; }
        set { capacidadeMaximaEmKg = value; }
    }

    // ATRIBUTOS SOMENTE LEITURA
    double velocidadeAtualEmKM = 0;

    public double VelocidadeAtualEmKM
    {
        get { return velocidadeAtualEmKM; }
    }

    protected double capacidadeCarregadaemKg = 0;

    public double CapacidadeCarregadaemKg
    {
        get { return capacidadeCarregadaemKg; }
    }

    // MÉTODOS
    public virtual void Carregar(double peso)
    {
        if (peso + capacidadeCarregadaemKg > capacidadeMaximaEmKg)
        {
            double excedido = (peso + capacidadeCarregadaemKg) - capacidadeMaximaEmKg;
            throw new CapacidadeMaximaExcedidaException(excedido);
        }
        else
            capacidadeCarregadaemKg += peso;

        Console.WriteLine("Carregado: {0}", capacidadeCarregadaemKg);
    }

    public virtual void Acelerar()
    {
        velocidadeAtualEmKM++;
    }

    public abstract double PagarPedagio();

    public override string ToString()
    {
        // O método ToString() deverá exibir todos os atributos da classe, concatenados.
        return "Descrição: " + descricao + Environment.NewLine +
               "Capacidade máxima: " + capacidadeMaximaEmKg + Environment.NewLine +
               "Capacidade carregada: " + capacidadeCarregadaemKg + Environment.NewLine +
               "Velocidade atual: " + velocidadeAtualEmKM + Environment.NewLine;
    }
}

Caminhão

CAMINHÃO

class Caminhao : Veiculo, IDadosAdicionais
{
    public Caminhao() { QuantidadeEixos = 0; }

    public int QuantidadeEixos { get; set; }

    public override double PagarPedagio()
    {
        return 5 * QuantidadeEixos;
    }

    // Exibe no console "Carregado". Caso o peso ultrapasse o peso máximo, NÃO gere uma exceção, mas exiba em vídeo a mensagem Sobrecarregado;
    public override void Carregar(double peso)
    {
        capacidadeCarregadaemKg += peso;
        if (capacidadeCarregadaemKg > CapacidadeMaximaEmKg)
            Console.WriteLine("Sobrecarregado");
        else
            Console.WriteLine("Carregado");
    }

    public override void Acelerar()
    {
        if (capacidadeCarregadaemKg <= CapacidadeMaximaEmKg)
            base.Acelerar();
        else
            throw new CapacidadeMaximaExcedidaException();
    }

    public override string ToString()
    {
        return base.ToString() + Environment.NewLine +
               "Quantidade de eixos: " + QuantidadeEixos;
    }

    public void Descarregar()
    {
        Console.WriteLine("Descarregado");
        capacidadeCarregadaemKg = 0;
    }
}

Interface

INTERFACE

public interface IDadosAdicionais
{
    int VelocidadeLimpador { get; set; }

    void AbrirPorta();
    void AcionarLimpador();
}

Carro

CARRO

public class Carro : Veiculo, IDadosAdicionais
{
    public int QtdePortas { get; set; }
    public bool UtilizaReboque { get; set; }

    public override string ToString()
    {
        return base.ToString() + Environment.NewLine +
               "Qtde de portas: " + QtdePortas + Environment.NewLine +
               "Utiliza Reboque: " + (UtilizaReboque == true ? "Sim" : "Não"); // isto é um if ternário...
    }

    public override double PagarPedagio()
    {
        if (UtilizaReboque)
            return 10;
        else
            return 7;
    }
}

Moto

MOTO

class Moto : Veiculo
{
    public int cilindradas { get; set; }

    public Moto()
    {
        cilindradas = 0;
    }

    public void Empinar()
    {
        Console.WriteLine("Empinando...");
    }

    public override string ToString()
    {
        return base.ToString() + Environment.NewLine + "cilindradas: " + cilindradas;
    }

    public override double PagarPedagio()
    {
        return 2;
    }
}

Exceções Personalizadas

EXCEÇÃO

class CapacidadeMaximaExcedidaException : Exception
{
    public CapacidadeMaximaExcedidaException(double pesoExcedido)
        : base("Capacidade excedida em " + pesoExcedido + " kg") { }

    public CapacidadeMaximaExcedidaException()
        : base("O veículo está sobrecarregado e não pode acelerar.") { }
}

Polimorfismo com Interface

POLIMORFISMO COM INTERFACE

1

foreach (Veiculo v in listaVeiculos)
{
    if (v is IDadosAdicionais) // se o veículo implementar a interface
    {
        (v as IDadosAdicionais).AbrirPorta(); // faz o cast
    }
}

4

3

Pintor pintor = new Pintor();
Casa c = new Casa();
pintor.EfetuaPintura(c);
Carro c = new Carro();
pintor.EfetuaPintura(c);

Conceitos Fundamentais

Atributos estáticos: não é necessário instanciar o objeto da classe para utilizar o atributo, basta mencionar a classe que o contém. Será um atributo global (todos os objetos terão acesso a ele).

  • Criação: public static int VRdiario;
  • Utilização: NomeDaClasse.VRdiario = 12;

Métodos estáticos: também não é necessário instanciar um objeto da classe para utilizar esse método.

  • Criação: public static void SomaValor() { }
  • Utilização: NomeDaClasse.SomaValor();

Método virtual: fica na classe pai, pode conter o desenvolvimento do método, onde todos os filhos poderão executar esse método ou sobrescrevê-lo.

  • Criação: public virtual double CalculaTaxa() { return 10; }

Método override: fica na classe filha e pode sobrescrever o método criado no pai.

  • Criação: public override double CalculaTaxa() { return valor * 0.1; }

Base: caso queira utilizar o método da classe pai dentro de um método da classe filha, basta fazer o seguinte:

public override double CalculaTaxa()
{
    return base.CalculaTaxa() + valor * 0.1;
}

Classe abstrata: quando uma classe não pode ou não serve para ser instanciada, sendo útil apenas como classe pai. Para simplificar o código, tornamos essa classe pai abstrata.

  • Criação: abstract class Funcionario { }

Métodos abstratos: quando todas as classes filhas precisarem conter um método que funcionará de forma diferente para cada uma, mas com a mesma assinatura, deve-se criar um método abstrato na classe pai e implementá-lo na filha.

  • Criação na classe pai: public abstract void CalculaAlgo();
  • Implementação na filha: public override void CalculaAlgo() { }

If ternário: "Utiliza Reboque: " + (UtilizaReboque == true ? "Sim" : "Não");

Acesso a atributos de classe filha a partir da classe pai (cast):

(objetoDaClassePai as ClasseFilha).atributoDaClasseFilha

Exceção Personalizada: Criação e Utilização

Criação:

class CapacidadeMaximaExcedidaException : Exception
{
    public CapacidadeMaximaExcedidaException(double pesoExcedido)
        : base("Capacidade excedida em " + pesoExcedido + " kg") { }

    public CapacidadeMaximaExcedidaException()
        : base("O veículo está sobrecarregado e não pode acelerar.") { }
}

Utilização:

if (peso + capacidadeCarregadaemKg > capacidadeMaximaEmKg)
{
    double excedido = (peso + capacidadeCarregadaemKg) - capacidadeMaximaEmKg;
    throw new CapacidadeMaximaExcedidaException(excedido);
}

Listagem de Veículos

LISTAR

List lista = new List();

private void btnListar_Click(object sender, EventArgs e)
{
    if (cbOpcoes.SelectedIndex == -1)
    {
        MessageBox.Show("Selecione um tipo de visualização.");
        return;
    }

    txtOutput.Clear();

    foreach (Veiculo v in lista)
    {
        bool faz = false;

        if (cbOpcoes.SelectedIndex == 0)
            faz = true;
        else if (cbOpcoes.SelectedIndex == 1 && v is Carro)
            faz = true;
        else if (cbOpcoes.SelectedIndex == 2 && v is Moto)
            faz = true;
        else if (cbOpcoes.SelectedIndex == 3 && v is Caminhao)
            faz = true;

        if (faz)
            txtOutput.Text += v.ToString() + Environment.NewLine + Environment.NewLine;
    }
}

Pesquisar Veículos

PESQUISAR

private void btnListar_Click(object sender, EventArgs e)
{
    if (cbOpcoes.SelectedIndex == -1)
    {
        MessageBox.Show("Selecione um tipo de visualização.");
        return;
    }

    txtOutput.Clear();

    foreach (Veiculo v in lista)
    {
        bool faz = false;

        if (cbOpcoes.SelectedIndex == 0)
            faz = true;
        else if (cbOpcoes.SelectedIndex == 1 && v is Carro)
            faz = true;
        else if (cbOpcoes.SelectedIndex == 2 && v is Moto)
            faz = true;
        else if (cbOpcoes.SelectedIndex == 3 && v is Caminhao)
            faz = true;

        if (faz)
            txtOutput.Text += v.ToString() + Environment.NewLine + Environment.NewLine;
    }
}

Baixar

PDF Word HTML