quarta-feira, 19 de fevereiro de 2014

Encapsulamento, Polimorfismo, Herança – Parte 03


Herança

A herança é um mecanismo da Orientação a Objeto que permite criar novas classes a partir de classes já existentes, aproveitando-se das características existentes na classe a ser estendida. Este mecanismo é muito interessante, pois promove um grande reuso e reaproveitamento de código existente.  Com a herança é possível criar classes derivadas, subclasses, a partir de classes bases, superclasses. As subclasses são mais especializadas do que as suas superclasses, mais genéricas. As subclasses herdam todas as características de suas superclasses, como suas variáveis e métodos. A linguagem Java permite o uso de herança simples, mas não permite a implementação de herança múltipla. Para superar essa limitação o Java faz uso de interfaces, o qual pode ser visto como uma “promessa”que certos métodos com características previamente estabelecidas serão implementados, usando inclusive a palavra reservada implements para garantir esta implementação. As interfaces possuem sintaxe similar as classes, no entanto apresentam apenas a especificação das funcionalidades que uma classe deve conter, sem determinar como essa funcionalidade deve ser implementada. Apresentam apenas protótipos dos métodos.
 Por exemplo, Imagine que dentro de uma organização empresarial, o sistema de RH tenha que trabalhar com os diferentes níveis hierárquicos da empresa, desde o funcionário de baixo escalão até o seu presidente. Todos são funcionários da empresa, porém cada um com um cargo diferente. Mesmo a secretária, o pessoal da limpeza, o diretor e o presidente possuem um número de identificação, além de salário e outras características em comum. Essas características em comum podem ser reunidas em um tipo de classe em comum, e cada nível da hierarquia ser tratado como um novo tipo, mas aproveitando-se dos tipos já criados, através da herança. Os subtipos, além de herdarem todas as características de seus supertipos, também podem adicionar mais características, seja na forma de variáveis e/ou métodos adicionais, bem como reescrever métodos já existentes na superclasse, polimorfismo. A herança permite vários níveis na hierarquia de classes, podendo criar tantos subtipos quanto necessário, até se chegar ao nível de especialização desejado. Podemos tratar subtipos como se fossem seus supertipos, por exemplo, o sistema de RH pode tratar uma instância de Presidente como se fosse um objeto do tipo Funcionário, em determinada funcionalidade. Porém não é possível tratar um supertipo como se fosse um subtipo, a não ser que o objeto em questão seja realmente do subtipo desejado e a linguagem suporte este tipo de tratamento, seja por meio de conversão de tipos ou outro mecanismo. Algumas linguagens de programação permitem herança múltipla, ou seja, uma classe pode estender características de várias classes ao mesmo tempo. É o caso do C++. Outras linguagens não permitem herança múltipla, por se tratar de algo perigo se não usada corretamente. É o caso do Java. Na Orientação a Objetos as palavras classe base, supertipo, superclasse, classe pai e classe mãe são sinônimos, bem como as palavras classe derivada, subtipo, subclasse e classe filha também são sinônimos.
O que um aluno, um professor e um funcionário possuem em comum? Todos eles são pessoas e, portanto, compartilham alguns dados comuns. Todos têm nome, idade, endereço, etc. E, o que diferencia um aluno de outra pessoa qualquer? Um aluno possui uma matrícula; Um funcionário possui um código de funcionário, data de admissão, salário, etc.; Um professor possui um código de professor e informações relacionadas à sua formação.
É aqui que a herança se torna uma ferramenta de grande utilidade. Podemos criar uma classe Pessoa, que possui todos os atributos e métodos comuns a todas as pessoas e herdar estes atributos e métodos em classes mais específicas, ou seja, a herança parte do geral para o mais específico. Comece criando uma classe Pessoa, Pessoa.java, como mostrado no código a seguir:
1.            public class Pessoa{
2.            public String nome;   
3.            public int idade;
4.            }

Esta classe possui os atributos nome e idade. Estes atributos são comuns a todas as pessoas. Veja agora como podemos criar uma classe Aluno que herda estes atributos da classe Pessoa e inclui seu próprio atributo, a saber, seu número de matrícula. Eis o código:
1.            public class Aluno extends Pessoa{
2.            public String matricula;
3.            }

Observe que, em Java, a palavra-chave usada para indicar herança é extends. A classe Aluno agora possui três atributos: nome, idade e matricula. Exemplo:
1.            public class Estudos{
2.            public static void main(String args[]){
3.            Aluno aluno = new Aluno();
4.            aluno.nome = "Aluno Esforçado";
5.            aluno.idade = 20;
6.            aluno.matricula = "XXXX99999";

7.            System.out.println("Nome: " + aluno.nome + "\n" +
8.            "Idade: " + aluno.idade + "\n" +
9.            "Matrícula: " + aluno.matricula);
10.         }
11.         }

A herança nos fornece um grande benefício. Ao concentrarmos características comuns em uma classe e derivar as classes mais específicas a partir desta, nós estamos preparados para a adição de novas funcionalidades ao sistema. Se mais adiante uma nova propriedade comum tiver que ser adicionada, não precisaremos efetuar alterações em todas as classes. Basta alterar a superclasse e pronto. As classes derivadas serão automaticamente atualizadas.
1.            public abstract class Animal {
2.            public abstract void fazerBarulho();
3.            }
4.            public class Cachorro extends Animal {
5.            public void fazerBarulho() {
6.            System.out.println("AuAu!");
7.            }
8.            }
9.            public class Gato extends Animal {
10.         public void fazerBarulho() {
11.         System.out.println("Miau!");
12.         }
13.         }
14.         class Veiculo {
15.         public Veiculo() {
16.         System.out.print("Veiculo ");
17.         }
18.         public void checkList() {
19.         System.out.println("Veiculo.checkList");
20.         }
21.         public void adjust() {
22.         System.out.println("Veiculo.adjust");
23.         }
24.         public void cleanup() {
25.         System.out.println("Veiculo.cleanup");
26.         }
27.         }
28.         class Automovel extends Veiculo {
29.         public Automovel() {
30.         System.out.println("Automovel");
31.         }
32.         public void checkList() {
33.         System.out.println("Automovel.checkList");
34.         }
35.         public void adjust() {
36.         System.out.println("Automovel.adjust");
37.         }
38.         public void cleanup() {
39.         System.out.println("Automovel.cleanup");
40.         }
41.         }   
42.         class Bicicleta extends Veiculo {
43.         public Bicicleta() {
44.         System.out.println("Bicicleta");
45.         }
46.         public void checkList() {
47.         System.out.println("Bicicleta.checkList");
48.         }
49.         public void adjust() {
50.         System.out.println("Bicicleta.adjust");
51.         }
52.         public void cleanup() {
53.         System.out.println("Bicicleta.cleanup");
54.         }
}   

Nenhum comentário:

Postar um comentário

O que achou dessa postagem?