Utilizar o conceito de classes abstratas é opcional/muito usado?

4 respostas
B

Estava pensando em um ambiente de desenvolvimento de uma grande corporação.
Ai gostaria de perguntar para os mais experientes: O uso de superclasses abstratas é muito usado? Pois quando houver manutenção em algum método da superclasse abstrata, na verdade a manutenção teria que ser feita em todas as suas classes filhas, já que os métodos são implementados na subclasses. Ai não vi um bom motivo para usar classes abstratas no lugar de herança com classes public, já que o método poderia ser sobrescrito.

4 Respostas

A

O fato de ser ou nao muito usado, nem sempre implica que é uma boa prática. O mais comum aliás é você encontrar muito código por aí usando vários anti-patterns (até por isso existe a expressao anti-pattern).

Sobre herança em geral, com classe abstrata ou nao, na prática é difícil de usar corretamente. O mais recomendado hoje em dia é geralmente usar composiçao ao invés de herança.
Geralmente isso deixa o código mais fácil de ser alterado no futuro, evitando esse efeito que você mencionou, por exemplo, de mexer na classe pai impactar todos filhos.

B

Obrigado pela resposta @AbelBueno, não conhecia o termo anti-patterns.
Bem provável que classes abstratas entrem bem nesse conceito.

Dragoon

Trabalhar com desenvolvimento Orientado a Objeto, não é uma tarefa fácil, mas, os padrões estão ai para solucionar diversos tipos de problemas.

Utilizar uma class abstract, é sim de grande utilidade quando há um estudo do que se pretende fazer e aonde se quer chegar, só lembrando, que uma classe só é responsável por um determinado problema, e só assim você conseguiria nesse caso especifico não ficar aumentando ou diminuindo métodos (como citado na pergunta, mas, pode ser tanta coisa), trabalhando com o mais simples objeto possível e a junção/união/compartilhamento entre classes/objeto resolveria o todo.

Porque usar uma classe abstract?
Se você usar um método que seja igual a todas as classes que herdam dessa classe abstract, implemente-o na classe abstract (classe abstract pode ter código igual classes comuns, elas só não pode ser instanciadas), não precisando criar nas classe que herdam e assim diminuindo consideravelmente manutenção de código, exemplo:

Classe Animal:

package Classes;
public abstract class Animal {    
    private boolean run;
    public Animal() {        
    }
    public Animal(boolean run) {
        this.run = run;
    }    
    public boolean isRun()
    {
        return this.run;
    }    
}

Classe Pato:

package Classes;
public class Pato extends Animal {
    public Pato() {        
    }
    public Pato(boolean run) {
        super(run);
    }    
}

Verifique que o código isRun(), está na classe abstract e a classe que herda tem esse método pronto, não precisando implementa-lo na classe que herda, sendo um código padrão para todos que herdam. Essa seria uma das inclusão de uma classe abstract em seu projeto.


Utilizando:

Pato p = new Pato(true);
System.out.println(p.isRun());
B

Obrigado @Dragoon, agora ficou muito claro. Eu entendi o conceito errado, relendo o livro aqui só é preciso implementar métodos abstratos nas subclasses, é possível criar métodos concretos dentro das classes abstratas que não exigem implementação dentro da subclasse. (isso não tava muito bem fundamentado na minha cabeça)

Obrigado.

Criado 4 de agosto de 2016
Ultima resposta 4 de ago. de 2016
Respostas 4
Participantes 3