Herança

 Herança é uma forma de reutilização de softwares em que uma nova classe é criada absorvendo  membros de uma classe exixtentes e aprimorada com capacidades novas ou modificadas. Com a Herança, você pode economizar tempo durante o desenvolvimento de um programa baseando novas classes no software existente.

Ao herdar membros de uma classe exixtente, a classe que herdou é chamada de subclasse, e a que existia anteriormente chamada de superclasse.


Para ficar mais claros vamos partir para um exemplo: Imagine que estivéssemos implementando um programa que fosse utilizado em um concessionária de veículos. Esta concessionária vende carros de passeio, jipes e veículos utilitários. Para implementar as classes destes veículos poderíamos criar três classes distintas,

A seguir a classe Jipe:

public class Jipe {
 
    private String marca;
    private Double capacidadeTanqueCombustivel;
 
    // Métodos Get e Set do atributo capacidadeTanqueCombustivel
 
    public Double getTanqueCombustivel() {
       return capacidadeTanqueCombustivel;
    }
 
    public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
       this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
    }
 
    // Métodos Get e Set do atributo marca
 
    public String getMarca() {
       return marca;
    }
 
    public void setMarca(String marca) {
       this.marca = marca;
    }
 
    // Método para representar a tração do Jipe
 
    public void ligarTracao4x4() {
       // Código aqui
    }
}

A classe que representa o nosso carro de passeio:

public class CarroPasseio {

    private String marca;
    private Double capacidadeTanqueCombustivel;
 
    // Métodos Get e Set do atributo capacidadeTanqueCombustivel
 
    public Double getTanqueCombustivel() {
       return capacidadeTanqueCombustivel;
    }
 
    public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
       this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
    }
 
    // Métodos Get e Set do atributo marca
 
    public String getMarca() {
       return marca;
    }
 
    public void setMarca(String marca) {
       this.marca = marca;
    }
 
    // Método para representar o ar condicionado do carro de passeio
 
    public void ligarArCondicionado() {
       // Código aqui
    }
}

E, finalmente, a classe que representa o nosso veículo utilitário:

public class Utilitario {

    private String marca;
    private Double capacidadeTanqueCombustivel;
 
    // Métodos Get e Set do atributo capacidadeTanqueCombustivel
 
    public Double getTanqueCombustivel() {
       return capacidadeTanqueCombustivel;
    }
 
    public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
       this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
    }
 
    // Métodos Get e Set do atributo marca
 
    public String getMarca() {
       return marca;
    }
 
    public void setMarca(String marca) {
       this.marca = marca;
    }
 
    // Método para representar o farol de milha do carro utilitário
 
    public void ligarFarolMilha() {
       // Código aqui
    }
}

Perceba que, nas linhas destacadas, temos as características que dizem respeito a apenas um dos tipos de veículos, isto é, no nosso modelo, apenas jipes têm tração 4x4, somente os carros de passeio têm opção de ligar o ar condicionado e os utilitários tem farol de milha.

Todas os demais estados e comportamentos são idênticos, na verdade para criar estas três classes foi realizado uma simples cópia e cola dos membros que são iguais. Agora, se a concessionária resolvesse criar mais 8 tipos de veiculos difrentes, teríamos que repetir todos esses códigos?

Na verdade nada disto seria necessário se nós tivéssemos utilizado corretamente o conceito de herança da programação Orientada a Objetos. Perceba que com exceção das características que estão grifadas todas as demais são comuns a todos os veículos, ou seja, é possível que tenhamos uma superclasse (classe Pai) Veiculo e que todas as demais herdem estas características comuns dela.

A nossa classe Veiculo ficaria da seguinte forma:

public class Veiculo {

    private String marca;
    private Double capacidadeTanqueCombustivel;
 
    // Métodos Get e Set do atributo capacidadeTanqueCombustivel
 
    public Double getTanqueCombustivel() {
       return capacidadeTanqueCombustivel;
    }
 
    public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
       this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
    }
 
    // Métodos Get e Set do atributo marca
 
    public String getMarca() {
       return marca;
    }
 
    public void setMarca(String marca) {
       this.marca = marca;
    }
}

Tudo o que era comum a todos os veículos foi concentrado na classe Veiculo. Para que as demais classes herdem estas características nós devemos utilizar a palavra reservada extends.

Então, as classes que definimos anteriormente, seriam reescritas da seguinte forma:

// Classe que representa o Jipe 

public class Jipe extends Veiculo{
   public void ligarTracao4x4()
   {
      //Código aqui
   }
}

// Classe que representa o Carro de passeio 

public class CarroPasseio extends Veiculo{
   public void ligarArCondicionado()
   {
      //Código aqui
   }
}

// Classe que representa o Utilitário 

public class Utilitario extends Veiculo {
   public void ligarFarolMilha()
   {
      //Código aqui
   }
}

Graficamente podemos representar esta hierarquia de classes da seguinte forma:





Nesta nova hierarquia de classes toda a subclasse de Veiculo irá compartilhar as suas características, dizemos que um jipe, carro de passeio ou utilitário são todos do tipo Veiculo. E da mesma forma toda a subclasse de Jipe irá herdar as características tanto de Veiculo quanto de Jipe.


4 comentários:

  1. Herança NÃO é uma forma de reutilização de "softwares" ! e sim reutilização de códigos !!
    Cuidado com o que publica !

    ResponderExcluir
  2. Olha o erro de português!!!
    exixtentes = existentes
    exixtente = existentes
    Se não sabe escrever, utilize um corretor ortográfico !

    ResponderExcluir
  3. Opa !
    "em um concessionária de veículos"
    Cadê a corncordância ?
    Correto: "em uma concessionária de veículos"

    Oberdan, não faz isso com nossa categoria cara!

    ResponderExcluir
  4. Fora os errinhos que os colegas acima citaram, esse foi a explicação mais clara que já encontrei!!
    Muito bom!!

    ResponderExcluir