Sunday, March 22, 2015

Superclasses e Subclasses

No último projeto nós trabalhos com JFrame e interfaces gráficas, bem como definição e chamada de funções. Nessa semana o foco foi em classes, subclasses e hereditariedade. Em termos simples, na linguagem java é possível criar objetos segundo uma classe, assim tendo todas as propriedades e funções inerentes a essa classe. As coisas começam a ficar interessantes quando se falam de subclasses e superclasses. Funciona assim: Subclasses necessariamente possuem uma superclasse, podendo herdar propriedades e funções da classe-pai. Dessa forma, é possível ter várias classes com propriedades diferentes, porém herdando uma ou mais atributos de uma superclasse em comum.

Para se mostrar a definição da subclasse, usa-se a sintaxe extends, e.g. “class Circle extends Shape”

O projeto dessa semana foca justamente nessa habilidade de herança. Foi construída uma superclasse Shape com os atributos aName e as funções getName e calculateArea (que, apenas em Shapes, retorna zero). Então fez-se as subclasses Circle, Square e Triangle, herdando todas as propriedades e funções de Shape, porém cada uma com os atributos específicos de sua forma geométrica, bem como uma redefinição da função calculateArea. Para isso, basta programar a função calculateArea dentro de cada subclasse, utilizando-se a extensão super.calculateArea caso queira-se chamar a função da superclasse Shape.

A redefinição foi feita para se poder chamar a função de todas as subclasses dentro de um único for, permitindo assim a fácil edição do funcionamento do programa. É desnecessário em uma aplicação tão simples, mas é análogo ao processo que permitiria a redefinição em programas muito maiores e mais complexos.

Segue agora o código completo, comentado.

1:  public class Shape {  
2:  private String name;  
3:  Shape(String aName) {name=aName;} //propriedade do nome, inerente à todas as subclasses  
4:  public String getName() {return name;}  
5:  public float calculateArea() {return 0.0f;} //percebe-se aqui o funcionamento da redefinição de funções nas subclasses  
6:  public static void main (String argv[])  
7:  {  
8:   Circle C = new Circle("Circle C"); //Cria os objetos  
9:   Square S = new Square("Square S");  
10:   Triangle T = new Triangle("Triangle T");  
11:   Shape shapeArray[] = {C,S, T};  
12:   //aqui pode-se rodar funções completamente diferentes sob um mesmo nome (calculateArea) pois cada uma é chamada enquanto dentro do escopo de uma subclasse específica  
13:   for (int i=0; i System.out.println("The area of " + shapeArray[i].getName() + " is " + shapeArray[i].calculateArea() + " sq. cm.\n");  
14:   }  
15:  }  
16:  }  
17:  class Circle extends Shape {  
18:   private int radius;  
19:   Circle(String aName){  
20:   super(aName); //Super é chamado para usar a propriedade do pai  
21:   radius = 3;  
22:   }  
23:   public float calculateArea(){  
24:   float area;  
25:   area = (float) (3.14*radius*radius);  
26:   return area;  
27:   }  
28:  }  
29:  class Square extends Shape {  
30:   private int side;  
31:   Square(String aName){  
32:   super(aName);  
33:   side = 3;  
34:   }  
35:   public float calculateArea(){  
36:   int area;  
37:   area = side*side;  
38:   return area;  
39:   }  
40:   }  
41:  class Triangle extends Shape {  
42:   private int side1, side2;  
43:   private double angle;  
44:   Triangle(String aName){  
45:   super(aName);  
46:   side1 = 2;  
47:   side2 = 3;  
48:   angle = 30.0;  
49:   }  
50:   public float calculateArea() {  
51:   float area;  
52:   area = (float)(0.5*side1*side2*Math.sin(Math.toRadians(angle)));  
53:   return area;  
54:   }  
55:  }  


Depois de executado, tem-se o output:

The area of Circle C is 28.26 sq. cm.

The area of Square S is 9.0 sq. cm.

The area of Triangle T is 1.5 sq. cm.

Até o próximo projeto!

No comments:

Post a Comment