Herança – Parte I

Conceitos e o problema Diamante

 

Neste artigo iremos falar sobre uma das características da Programação Orientada a Objetos (POO), a Herança. Caso você ainda não tenha familiaridade com os principais conceitos da POO sugiro uma leitura inicial sobre o assunto, para que possa ter maior aproveitamento neste texto. Existem muitos e bons artigos sobre o tema em português. Então vamos lá.

 

Todos sabem que herança é a característica que possibilita uma determinada classe herdar (daí o nome herança) membros (métodos e atributos) de uma outra classe. Arrisco-me a dizer que essa é a melhor característica da POO. Esta é uma opinião pessoal.

 

Sendo assim, se uma classe herda da classe Pelé, automaticamente ele poderá dar uma bicicleta sem mesmo saber jogar futebol. Veja o exemplo abaixo:

 

Listagem 1.

public class Pele

{

public void bicicleta()

{

        System.out.println("Gol de Bicicleta");

}

}

 

public class Qualquer extends Pele

{

}

 

public class ProgramaQualquer

{

public static void main(String[] args)

{

        Qualquer ze = new Qualquer();

         ze.bicicleta();

}

}

 

O exemplo de código acima não tem utilidade nenhuma, mas tem um efeito didático interessante. Sendo eu um Qualquer, posso dar uma bicicleta apenas herdando da classe Pelé. Você deve estar pensando agora, que então irá criar um super jogador herdando de Maradona, Zico e Pelé. Seria a classe MarZilé (MARadona + ZIco + PeLÉ).

 

Infelizmente não. Java não suporta herança múltipla, ou seja, ele o impede de estender dois objetos ao mesmo tempo. Este mecanismo era um recurso possível em C++ e você deve estar se perguntando , por que Java não suporta herança múltipla.

 

Talvez você também possa estar pensando na resposta e achando que Java não suporta herança múltipla por não saber como se comportar quando encontrassem em uma classe herdada dois métodos herdados de classes diferentes com o mesmo nome.

 

Eureca, está aí o motivo de Java não utilizar herança múltipla. Ele iria se confundir, se comportar de maneira inesperada e imprevisível. Bem! Vamos com calma. Realmente isso é um problema, é o chamado "Diamond problem" (Problema Diamante).

 

Vamos simular o problema. Criaremos um jogador com potencial de goleiro e atacante. Pode ser o Higuita com o Pelé? Ok, então agora o nosso jogador se chamará Higuilé (Higuita + Pelé).

 

Listagem 2.

public class Pele

{

public void defender()

{

        System.out.println("Entrar de Carrinho");

}

 

}

 

public class Higuita

{

public void defender()

{

        System.out.println("Pegar com as mãos");

}

}

 

// Isto não compila é apenas para simular o nosso exemplo

public Class Higuile extends Pele, Eguita

{}

 

public class ProgramaQualquer

{

public static void main(String[] args)

{

        Eguile goleiroAtacante = new Eguile();

        goleiroAtacante.defender();

}

}

 

O que aconteceria quando rodássemos o nosso ProgramaQualquer.java? O ato de defender no objeto goleiroAtacante, iria imprimir "Entrar de carrinho" ou "Pegar com as mãos"? Acho que o problema ficou mais fácil de entender agora e é por isso que Java não usa herança múltipla, certo?

 

Bom, isto não é toda a verdade. Para ser bem sincero este é o problema mais fácil de ser resolvido. Com uma pequena convenção de assinatura, do tipo, a classe que vier declarada primeira, terá o controle de sobrescrever os membros em situação de conflito de nomes ou qualquer coisa do gênero.

 

A outra parte da verdade é que o intuito da linguagem Java era ser familiar (quando digo familiar, digo parecida com C++) e simples (quando digo simples, digo retirar as coisas em C++ que davam dor de cabeça e confusão aos desenvolvedores). Então os arquitetos da linguagem Java chegaram à conclusão que herança múltipla em C++ dava mais trabalho do que os problemas que ela se propunha a resolver e por uma questão de SIMPLICIDADE resolveram retirar esse mecanismo da linguagem.

 

Mas não se desespere, é possível usar métodos de diferentes objetos através do uso de interfaces e você ainda poderá criar o seu super jogador.

 

Mas isso é tema para o nosso próximo artigo. Até lá.