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:
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.
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