Olá turma, aguém consegue me esclarecer essa dúvida:
Quando usar o abstract / virtual nas classes base?
E em qual situação não se usa o virtual/ override?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Olá turma, aguém consegue me esclarecer essa dúvida:
Quando usar o abstract / virtual nas classes base?
E em qual situação não se usa o virtual/ override?
Pelo que entendi, o abstract tem que ser utilizado quando as classes tem os mesmos métodos mas a maneira de aplica-los é diferente (obrigando a sobrescrever o método).
Já o virtual é quando você já estipula que o comportamento da classe é igual, porém possibilitando criar exceções.
Um exemplo: Nos temos um banco que trabalha com três tipos de contas. Todas elas possuem um rendimento e possibilitam o saque.
A primeira conta, iremos chamar de conta poupança, as principais caracteristicas dela é que o rendimento é de 0.5% ao mês e o valor de cada saque é de 15 centavos;
A segunda conta é uma conta especial onde ela possui o mesmo rendimento da conta poupança porém não é cobrado nada ao realizar o saque;
A terceira conta é uma conta de investimento, ela possui uma renda mensal de 1,5% ao mês e o valor de saque é de 50 centavos;
Como o metodo de saque é diferente para cada uma das contas, nos iremos definir que ela é uma classe abstrata, obrigando a implementar a regra dela em todas as classes filhas. O metodo de recolher juros ela é igual para a conta poupança e para a conta especial e é diferente para a conta de investimento, então podemos aplicar essa classe como virtual e apenas sobrescreve-la no metodo conta de investimento onde o recolhimento de juros é diferente.
public abstract class Conta
{
public double Saldo { get; set; }
public abstract void Saque(double valorSaque);
public virtual void RecolherJuros()
{
Saldo = Saldo + (Saldo * 0.005);
}
}
public class ContaPoupanca : Conta
{
public override void Saque(double valorSaque)
{
Saldo = Saldo - valorSaque - 0.15;
}
}
public class ContaEspecial : Conta
{
public override void Saque(double valorSaque)
{
Saldo = Saldo - valorSaque;
}
}
public class ContaDeInvestimento : Conta
{
public override void RecolherJuros()
{
Saldo = Saldo + (Saldo * 0.015);
}
public override void Saque(double valorSaque)
{
Saldo = Saldo - valorSaque - 0.50;
}
}
Meu entendimento sobre abstração e o virtual.
Classe Abstrata é um modelo de um objeto mas não pode ser instanciado. Será instanciado através de suas classes filhas. Um método abstrato define ações que a classe mãe deve ter mas não há implementação pois cada classe filha terá a sua implementação.
Método Virtual pode ter implementação na classe mãe e nas classes filhas pode ocorrer a sobreposição(override) do método com a implementação específica para a classe filha. Assim valerá o método da classe filha.