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?
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.