Classes abstratas

7 respostas
E

Qual é o principal propósito de se utilizar classes abstratas?

7 Respostas

darlan_machado

Até a versão 7 do java, era ter a possibilidade de implementar métodos concretos e forçar as subclasses a implementarem os métodos abstratos.
A partir do java 8, com as functional interfaces, isso se torna um pouco diferente, tendo em vista os default methods.

Dragoon

Classes abstratas é bem parecido com interfaces onde podem conter métodos abstratos para ser implementados nas classes derivadas concretas, mas, a diferença é que classes abstratas pode conter métodos implementados diferente das interfaces que só possui métodos para implementação, ou seja, essa é a diferença entre abstrata e interface.

  • Exemplo básico de classe abstrata:

    public abstract class B
    {
       public abstract string GetString();
       public virtual string GetName()
       {
           return GetType().Name;
       }
    }
    
  • Implementando classe abstrata:

    public class A : B
    {
        public override string GetString()
        {
            return GetName().Substring(1, 1);
        }
    }
    

Nesse caso não precisei implementar o GetName() porque já está implementado na classe abstrata.


  • Um exemplo de interface:

    public interface C
    {
        int Id { get; set; }
        string Nome { get; set; }        
    }
    

Percebe que não tem implementação e isso é uma característica da interface que só define quais métodos serão implementados.

Nota: esse exemplo foi feito em Csharp, não vi tag algum, aparentemente a duvida é num âmbito geral

Lucas_Santod

Uma classe abstrata não permite que ninguém crie uma nova instância de classe. Uma classe abstrata praticamente não tem muita utilidade sem ser estendida. Lembrando que é possível ter métodos abstratos, mas é necessário marcar a classe com abstrata também

darlan_machado

Considere as classes

public abstract class Abstrata {
    public abstract void saudacao();
}

E

public class TesteAbstrata {
    public static void main(String[] args) {
        Abstrata abs = new Abstrata() {
            public void saudacao() {
                System.out.println("Olá");
            }
        };
        abs.saudacao();
    }
}

Tente compilá-las.
Na verdade, o princípio é o mesmo para interfaces: você só precisa, obrigatoriamente, implementar todos os métodos abstratos.

Quem disse?
É óbvio que o uso de interfaces é mais interessante e mais recomendado, mas, se o teu modelo é bem feito e você não precisará encapsular, nem expandir a estrutura, pode sim, usar a classe abstrata.

Este é o principal objetivo da classe abstrata. Afinal, qual a coerência em criar-se uma classe abstrata, sem os métodos abstratos?

Agora, o óbvio: a partir do momento que pretendemos criar um modelo coeso e pouco acoplado, é inevitável que o uso de interfaces é monstruosamente mais recomendado.
Fica aí uma discussão sobre as vantagens da functional interfaxce vs abstract class.

Lucas_Santod

Realmente nesse caso sim, mas específico em um caso mais genérico, no qual eu estendo uma classe abstrata, já com seus métodos abstratos implementados e tento criar um novo objeto da classe abstrata, o compilador irá acusar um erro.
Esse é só um caso, realmente não citei com detalhes na resposta, fico agradecido por você demonstrar esses exemplos! :slight_smile:

Mike

O seu exemplo foi no C#, mas só abrindo um parenteses no java: a partir do Java 8 é possível ter métodos implementados na interface utilizando o modificador default

Dragoon

Mais isso é um recurso da linguagem, como eu disse na minha resposta como não tem uma tag que faça referencia eu entendo como geral, e no geral não tem isso.

Obrigado por oferecer um item a mais a resposta. (que server exclusivamente pra Java, pelo menos por enquanto e não posso dar uma opinião se isso é bom ou ruim, que seria outro questionamento).

Criado 19 de junho de 2018
Ultima resposta 20 de jun. de 2018
Respostas 7
Participantes 5