Countdown

Final Countdown

Faltam dias. Ou segundos.

domingo, 15 de março de 2015

#7 POO (2) - Subclasses & Herança

Olá, tudo bem?

A ideia de hoje é explorar alguns conceitos de Orientação a Objetos, como Subclasses e Herança, extensão quase imediata dos conceitos de Classe vistos na Lição 5.


---//---

[POO (2) - Subclasses e Herança]

Uma Subclasse é uma divisão hierárquica de classes, uma espécie de subconjunto de métodos e variáveis de um conjunto maior. Por exemplo, podemos ter uma Classe Pessoa com variáveis como Nome e RG, e métodos como Comer() e Dormir(). Podemos ter uma SubClasse Engenheiro com a variável Salário, métodos Projetar() e Construir(), por exemplo. Um objeto da Subclasse Engenherio teria também as variáveis de uma pessoa, Nome e RG além de poder usar os seus métodos, Comer() e Dormir(). Porém um objeto da classe Pessoa não pode ter as variáveis ou usar métodos de um Engenheiro.
Figura 1 - Diagrama de Venn de Classes e Subclasses.

O conceito de a Subclasse poder usar os métodos Comer( ) e Dormir( ) da Classe Pessoa, além de suas variáveis, é chamado de Herança.
Podemos denominar a Classe Pessoa como uma Superclasse.

Às vezes alguma subclasse é abstrata demais, de forma a não admitir um objeto. Imagine uma superclasse Animal de acordo com a Figura 2 abaixo, extraída do material do curso de CES-22:

Figura 2 - Diagrama hierárquico de Classes.

Como Animal é generalizada demais, podemos declará-la como:
abstract class Animal {...}

Essa classe pode até ter métodos, como Comer( ) e Dormir( ), porém não irá admitir nenhum objeto, ou seja, não podemos fazer:
Animal Homem = new Animal();

Vamos agora para um exemplo prático. Temos a superclasse das formas geométricas e duas subclasses círculo e quadrado, conforme a Figura 3 extraída do curso de CES-22:
Figura 3 - Superclasse Formas e suas duas subclasses.

A classe Shape teria a seguinte implementação básica:

-------------------------------------------\\-----------------------------------------------
public class Shapes 
{
    private String name;
    Shapes(String aName){ name = aName;} // Construtor
    public String getName(){ return name;}
    public float calculateArea(){return 0.0f;}
}
-------------------------------------------\\-----------------------------------------------
Código 1 - Superclasse Shapes.

Agora usaremos como exercício a criação de uma subclasse triângulo. Ela deverá ter as seguintes propriedades básicas:
-> Construtor - Herdado da superclasse Shapes
-> name - Herança
-> lados (vetor de 3 elementos -  vamos simplificar o problema)
-> getName( ); - Herança
-> calculateArea( ); (deve ter uma implementação própria).

A declaração da subclasse triângulo deve ter a seguinte forma:
class Triangle extends Shape { ... }

Note que no exemplo da Calculadora já utilizamos conceitos de subclasse, mesmo sem ter conhecimento sobre o que ela era de fato e suas potencialidades. 

Assim, implementando a subclasse:

-------------------------------------------\\-----------------------------------------------
public class Shapes 
{
    private String name;
    Shapes(String aName){ name = aName;} // Construtor
    public String getName(){ return name;}
    public float calculateArea(){return 0.0f;}

    public class Triangle extends Shapes {
        private float a, b, c;              // Lados do triângulo
        Triangle (String aName){  // Construtor da subclasse Triangle.
            super(aName);                // Chama o Construtor da superclasse
            c = 3; b = 4; a = 5; 
        }
        public float calculateArea(){  // Fórmula de Heron para calcular a área (Matemática)
            float p = (a+b+c)/2;
            return (float)Math.sqrt(p*(p-a)*(p-b)*(p-c));
        }
    }
}
-------------------------------------------\\-----------------------------------------------
Código 2 - Subclasse Triangle.

Observe que o uso de uma SubClasse torna o código mais elegante e facilita a modificação do programa. Digamos que queiramos adicionar à figura geométrica a informação Número de lados, por exemplo. Bastaria adicionar essa variável à Superclasse Shapes para que todas as suas Subclasses sofressem essa modificação também.
Igualmente, fica mais fácil editar cada Subclasse e suas peculiaridades separadamente, como no cálculo da área, que é bem diferente para um círculo ou para um quadrado. O compilador realizará uma vinculação dinâmica (Dynamic Binding) do determinado Objeto ao devido método referente a ele, por exemplo, se o objeto for um quadrado, o cálculo de sua área será lado*lado, um círculo, Pi*raio*raio, a partir de uma mesma chamada de método.

O leitor pode testar o código no método main, se quiser conferir as funcionalidades do programa. Pode também conferir as Subclasses Circle e Square no código abaixo, se tiver curiosidade:
Código 3 - Subclasses Circle e Square.

Como últimas observações, não existe Herança múltipla em Java. Ou seja, não podemos implementar, por exemplo, uma pessoa hermafrodita herdando variáveis e métodos das superclasses Homem e Mulher simultaneamente. 

Temos ainda uma estrutura chamada Interface, puramente abstrata em Java. Ela é uma espécie de contrato: Todos os métodos e (variáveis que devem ser todas constantes ali) presentes devem ser implementados pelas classes que fizerem uso destas interfaces. Uma classe pode fazer uso de várias interfaces simultaneamente, contornando a limitação de não haver herança múltipla em Java. A sintaxe de uma interface é:
interface Poligono
{                           
    float area();
            float perimetro();
}                           

E depois a classe que utilizará essa interface deverá necessariamente implementar todos os métodos dessa classe, e também usar a seguinte sintaxe em sua declaração:
 public class Triangle implements Poligono { ... }

Por hoje é só! A lição foi um pouco abstrata (péssima piada), mas com uma boa superclasse de conhecimentos fica muito mais fácil desenvolver a subclasse da sua imaginação e ideias.

Gente, o blog "Aprender Java é Divertido" está no Google!! Página 1!!! Esse é um momento de glória para mim. Espero sinceramente que pelo menos algum leitor desfrute de algum conhecimento deste site algum dia. Muito bem, #PartiuTop1 !!! Até mais!

Nenhum comentário:

Postar um comentário