Herança e Polimorfismo em C#: Veículos, Interfaces e Exceções
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
foreach (Veiculo v in listaVeiculos)
{
if (v is IDadosAdicionais) // se o veículo implementar a interface
{
(v as IDadosAdicionais).AbrirPorta(); // faz o cast
}
}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).atributoDaClasseFilhaExceçã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;
}
}