Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Classe abstrata utilização

Boa Noite, Quando defino uma classe como abstrata não consigo instanciar o objeto, portanto preciso sobrepor os métodos que preciso nas classes filhas...certo? O que não consigo visualizar seria a real utilização de uma classe abstrata sendo que tenho que sobrepor seus métodos nas filhas, na minha visão estaria duplicando os códigos. Por favor, poderiam tirar essa minha dúvida.

1 resposta
solução!

Pensa nas pessoas que trabalham numa empresa. Podemos dizer que todas elas possuem algum cargo: temos por exemplo o analista, o estagiário, a diretora, o faxineiro...

O analista possui tarefas que são exclusivamente do seu cargo, assim como o estagiário, a diretora e o faxineiro.

Então, usando o analista e a diretora como exemplos, poderíamos escrever classes para eles:

public class Analista {

    public void escreveCodigo() {
        //tarefa do analista
    }
}
public class Diretora {

    public void planeja() {
        //tarefa da diretora
    }
}

Então, sempre que um analista entrar na empresa, basta instanciar um novo objeto da classe Analista. O mesmo vale para os outros cargos.

No entanto, todas essas "pessoas que trabalham na empresa" possuem também coisas em comum, digamos: todas recebem salário.

O problema é: como garantir que "todas as pessoas que trabalham na empresa" tenham um salário?

No dia a dia, não costumamos dizer frase "a pessoa que trabalha na empresa", temos uma palavra que significa isso: Funcionário!

Então, podemos dizer que todo funcionário tem salário e que Analista é um Funcionário. Diretora é um Funcionário. Veja a herança aparecendo...

public class Funcionario {

    public double salario() {
        // Salário de um funcionário
    }
}
public class Analista extends Funcionario {

    public void escreveCodigo() {
        //tarefa do analista
    }

    @Override
    public double salario() {
        // Salário de um analista
    }
}
public class Diretora extends Funcionario {

    public void planeja() {
        //tarefa da diretora
    }

    @Override
    public double salario() {
        // Salário de uma diretora
    }
}

Então, a classe Funcionario centraliza tudo que for comum a todos os funcionários. Porém, temos um problema: funcionário não é um cargo, é apenas uma generalização dos cargos. Ou seja, não podemos deixar que alguém instancie a classe Funcionario (pois temos Analista, Diretora, Faxineiro, Estagiário...).

Para isso, dizemos que Funcionario é uma classe abstrata, ou seja, ela não pode ser instanciada:

public abstract class Funcionario {

    public double salario () {
         //Salário de um funcionário
    }
}

Ainda pensando no funcionário: qual o valor do seu salário? Faz sentido o funcionário (que é uma generalização dos cargos) ter um valor de salário? Embora o Funcionário tenha que ter um salário, quem sabe os valores dos salários são os cargos. Então, para não ficarmos com um método vazio no Funcionário, podemos indicar que sua implementação ficará nos filhos:

public abstract class Funcionario {

    public abstract double salario ();
}

Essa é uma das aplicações de classes abstratas. ;)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software