Em ciência da computação, a abstração é a habilidade de concentrar nos aspectos essenciais de um contexto, ignorando características menos importantes ou acidentais. Em modelagem ou programação orientada a objetos, uma classe é uma abstração de entidades existentes no contexto de um software,[1][2][3] como exemplo, imaginamos a abstração referente a classe Animais, que se divide em várias sub-classes, como: Anfíbios, Répteis e Mamíferos, que contém objetos de sub-classe como Ser-humano, Jacaré e outros.
Uma classe abstrata é desenvolvida para representar entidades e conceitos abstratos. A classe abstrata é sempre uma superclasse que não possui instâncias. Ela define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta - a parte genérica dessa funcionalidade - que é compartilhada por um grupo de classes derivadas. Cada uma das classes derivadas, completa a funcionalidade da classe abstrata adicionando um comportamento específico.
No exemplo abaixo, implementado em Java, a classe abstrata Eletrodomestico a qual será instanciada por outra classe filha (classe estendida):
public abstract class Eletrodomestico { private boolean ligado; private int voltagem; /* métodos abstratos * não possuem corpo, da mesma forma que as assinaturas de método de uma interface */ public abstract void ligar(); public abstract void desligar(); /* método construtor * Classes Abstratas também podem ter métodos construtores, porém não podem ser usados para instanciar um objeto diretamente */ public Eletrodomestico(boolean ligado, int voltagem) { this.setLigado(ligado); this.setVoltagem(voltagem); } /* métodos concretos * Uma classe abstrata pode possuir métodos não abstratos */ public void setVoltagem(int voltagem) { this.voltagem = voltagem; } public int getVoltagem() { return this.voltagem; } public void setLigado(boolean ligado) { this.ligado = ligado; } public boolean isLigado() { return ligado; } }
A classe filha (sub-classe Radio, uma classe estendida de Eletrodomestico):
//sub-classe (classe estendida): public class Radio extends Eletrodomestico { //atributos... public static final short AM = 1; public static final short FM = 2; private int banda; private float sintonia; private int volume; //metodos do classe Radio... //metodo construtor... public Radio(int voltagem) { super(true, voltagem); setBanda(Radio.FM); setSintonia(0); setVolume(0); } //@return the banda public int getBanda() { return banda; } //@param banda the banda to set public void setBanda(int banda) { this.banda = banda; } //@return the sintonia public float getSintonia() { return sintonia; } //@param sintonia the sintonia to set public void setSintonia(float sintonia) { this.sintonia = sintonia; } //@return the volume public int getVolume() { return volume; } //@param volume the volume to set public void setVolume(int volume) { this.volume = volume; } //implementação dos métodos abstratos public void desligar() { super.setLigado(false); setSintonia(0); setVolume(0); } public void ligar() { super.setLigado(true); setSintonia(88.1f); setVolume(25); } //abaixo teríamos todos os métodos construtores (get e set)... }
A classe de Aplicação:
package aula_abstrata; public class aplicacaoAbstrata { //@param args public static void main(String[] args) { //Instancia a classe Radio Radio radio1 = new Radio(110); /* * chamando os métodos abstratos implementados * dentro de cada classe ( Radio) */ radio1.ligar(); System.out.print("e o Rádio está "); System.out.println(radio1.isLigado() ? "ligado." : "desligado."); } }