Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Qual a diferença entre virtual e abstract

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?

2 respostas
solução!

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.