• Nenhum resultado encontrado

CAPITULO 4 CONCEITOS DE PROGRAMAÇAO

4.3.3 CONCEITO DE CLAS S E S

O conceito de classes é muito impottante para o entendimento da orientação a objetos.

Uma classe é uma coleção de objetos que podem ser descritos por um conjunto básico de atributos e possuem operações semelhantes. Falamos em um conjunto básico de atributos e operações semelhantes, pois veremos adiante que nem todos os objetos da

mesma classe precisam ter exatamente o mesmo conjunto de atributos e operações. Quando um objeto é identificado com atributos e operações semelhantes em nos­ so sistema, diz-se que pode ser agrupado em uma classe. Esse processo é chamado de generalização. Por outro lado, pode ocorrer que um objeto, ao ser identificado, consti­

tua-se, na verdade, de uma classe de objetos, visto que dele podem se derivar outros objetos. Já esse processo é chamado de especialização.

Na Figura 4, partindo-se de uma classe veículos, observa-se a existência de vári­ os tipos de veículos e a criação de especializações como: os utilitários, os veículos

esporte, os de passeio e os de transpo1te de passageiros. Porém, se os veículos utilitári­ os, esporte, de passeio e de transpotte de passageiros são considerados tipos de veícu­

Utilitário

Veículos

Esporte Passeio

I FIGURA 41 Generalização e especialização

Passageiros

n

"'' o

O critério para criar a classe ou as especializações dessa classe está relacionado aos atributos e operações de cada um dos objetos. Assim, pode-se dizer que, para todos os tipos de veículos, têm-se atributos genéricos como: marca, mo delo, ano de fabrica­ ção, potência do motor, número de eixos, capacidade de carga etc. Têm-se também

operações semelhantes para todos como: dar partida, acelerar , frear, estacionar etc.

Nada impede, contudo, que os veículos de passeio sejam subdivididos em outros tipos, como os tipos sedan, minivan etc. Nesse caso, a classe veículos teria uma sub­

classe passeio e dessa derivariam os veículos sedan e as minivans. 4.3.4 I N STANCIAS D E OBJETOS "

Quando se fala em classes de objetos, está sendo considerado que se podem incluir objetos em cada uma delas. Como exemplo, considere que será modelado um sistema para uma revendedora de veículos que comercializa os veículos conforme o esquema citado. Cada novo veículo adquirido pela revendedora seria cadastrado no sis­

tema obedecendo a sua classificação. Supondo que o veículo seja um automóvel de passeio do tipo sedan, cria-se um novo objeto dessa classe, que será chamada de uma instância de objeto, conforme o seguinte esquema:

Classe Veículos Subclasse Passeio Subclasse Sedan Instância marca: Opel modelo: Fire ano: 2002 potência: 195cv eixos: 2 carga: 1.500kg. Instância marca: Thunderbird modelo: Hatch ano: 2000 potência: 250cv eixos: 2 carga: 1.800kg.

Dessa forma, para cada novo veículo adquirido seria criada uma nova instância de objeto de uma determinada classe.

' - CAPITULO 4 - CONCEITOS DE PROGRAMAÇAO

4.3.5 H E RANÇA

39

Foi dito anteriormente que uma classe é constituída de objetos com atributos e operações semelhantes. Esse princípio orienta a implementação da herança. A herança nada mais é do que a implementação da generalização; é o compartilhamento de atribu­ tos e operações entre classes com base em um relacionamento hierárquico. Quando se cria uma nova instância de um objeto, dizemos, em orientação a objetos, que esse novo objeto herda os atributos e operações de sua classe.

No exemplo de instância de objeto, foi visto que um novo veículo adquirido possuía os seguintes atributos: marca: Opel, modelo: Fire, ano: 2002, potência: 195cv, eixos: 2 e carga: 1 .500kg. Esses atributos são herdados da classe veículos, bem como suas operações: dar partida, acelerar, frear e estacionar. Ou seja, o objeto marca: Opel poderá executar as mesmas operações definidas em sua classe, sem que para tanto essas tenham de ser redefinidas para ele.

O conceito de herança é importantíssimo na orientação a objetos pois, como veremos na Seção 4.3.8 - "Aplicação", a programação fica bastante facilitada. Os

códigos escritos na definição da classe, de seus ah·ibutos e operações são aproveitados por suas sub-classes e instâncias de objeto, o que reduz o número de linhas de progra­ mação, gera maior qualidade e facilita a programação, a verificação de erros e futuras

-

correçoes.

4.3.6 P O L I M O R F I S M O

Associado ao conceito de herança, o polimorfismo permite que um objeto assu­ ma um comportamento diferente daquele definido em sua classe. Polimorfismo signifi­ ca a capacidade de assumir muitas formas. Isso é importante para permitir o tipo de classificação como a exemplificada anteriormente. Foi visto que uma classe veículos

possuía as subclasses utilitários, esporte, passeio e passageúvs e a operação dar pat1i­ da. Tomando-se a operação dar partida como exemplo, pode-se dizer que, para dar partida em um veículo de passeio e em um veículo utilitário, pode ser preciso executar tarefas diferentes. Muitas vezes, dependendo do tipo de motor que equipa o veículo e do combustível utilizado, o processo muda significativamente. Considerando-se, assim, que a operação dar partida precisa ser adaptada para a classe utilitários, reescrevem-se as tarefas para essa operação, que passará a responder de forma diferente apenas para essa classe e para os objetos instanciados por ela.

Em resumo, as classes utilitários, esporte, passeio e passageiros herdam todos os atributos e as operações da classe veículos. Porém, para a classe utilitários, a opera­ ção dar partida foi modificada para atender a necessidades específicas. Logo, diz-se que a operação dar partida apresenta polimorfismo.

4.3.7 ENCAPS U L A M E N TO

Pensando no modelo de representação de um objeto, pode-se visualizar facil­ mente a questão do encapsulamento. O encapsulamento, também chamado de

Utilitários dar partida Veículos marca modelo ano Atributos potência eJXOS carga dar partida acelerar O perações frear estacionar

Esporte Passeio Passageiros

I FJGU RA si Exemplo de polimorfismo

ocultamento de informações, consiste na separação entre os aspectos externos de um objeto, acessíveis por outros objetos, e os detalhes internos da sua implementação, que ficam ocultos dos demais objetos. O encapsulamento impede que um programa se torne

tão interdependente que uma pequena modificação possa provocar grandes efeitos que se propaguem por todo o sistema. E um pouco do conceito de modularização discutido em programação estruturada, lembra-se? Dividia-se o programa em módulos, tratando cada um deles o mais separadamente possível, de modo que fosse 'quebrada' a comple­ xidade do problema. Aqui o pensamento é o mesmo, porém a forma de implementação é bastante diferente.

' -

CAPITULO 4

-

CONCEITOS DE PROGRAMAÇAO

4.3.8 A P L I CAÇÃO

4 1

Será apresentada nesta seção uma aplicação escrita em Java em que os principais conceitos discutidos em orientação a objetos aparecem. Trata-se de um programa bas­ tante simples que representa um robô que possui os seguintes atributos: nome, número de série, data de fabricação e nível da bateria. Possui, também, as seguintes operações:

mudaNome, mostraNome e mostraTudo, que alteram o conteúdo de seus atributos e o exibem. O robô executa algumas operações matemáticas básicas; cada execução conso­

me um pouco da carga de sua bateria.

1 . public class Robo_superclasse{

2 . String nome; 3 . int serie; 4 . String data; 5 . int bat; 6 . public Robo_superclass e ( ) { 7 . }

8 . public void divide ( ) {

9 . }

1 0 . public void soma ( ) { 1 1 . }

1 2 . public void subtra i ( ) {

13 . }

1 4 . 1 5 . 1 6 . }

public void multiplica ( ) { }

A classe Robo_superclasse será utilizada para demonstração do recurso de herança. A classe Robo, apresentada a seguir, herda os atributos (variáveis) e métodos da classe Robo_superclasse:

class Robo extends Robo_supeclasse

Este recurso permite às classes herdeiras (subclasses) implementar os métodos herdados de diferentes maneiras; a esse recurso chamamos polimorfismo.

Neste exemplo não estaremos representando esse recurso, mas ele poderia ser im­ plementado utilizando-se os métodos soma ( ) , subtracao ( ) , mul tiplicacao ( )

ou divisao (

)

de maneiras diferentes em outras classes herdeiras, por exemplo:

class Robo_2 extends Robo_superclasse {

public void soma(double a , double b ) { double c ;

c = ( a + b + 5 ) ;

1 .

2 .

3 .

class Robo extends Robo_superclasse

{ public Robo ( ) { 4 . nome = "XPT11 " ; 5 . serie = 0 0 0 0 ; 6 . data = " 0 0 ! 0 0 / 0 0 0 0 • ; 7 . bat = 5 ; 8 . }

9 . public Robo ( String n, int s , String d ) {

1 0 . nome = n;

1 1 . ser1e = s ;

1 2 . data = d ;

1 3 . bat = 5 ;

1 4 . }

1 5 . public void mudaNome( String novo nome) {

1 6 . this. nome = novo_nome;

17 . }

1 8 . public String mostraNome ( ) {

1 9 . return nome;

2 0 . }

2 1 . public void mostraTudo ( ) {

22 . System.out . println ( "Robo chama- s e : • + nome) ;

23 . System.out.print1n ( "Serie: • + serie) ; 24 . System .out.println ( "Data: " + data) ;

2 5 . System.out.println( "Bateria: • + bat ) ;

2 6 . }

27 . public void soma (int a , int b) {

2 8 . System . ou t . println ("O nivel da bateria esta' em: • + bat ) ;

2 9 . if (bat >=1) { 3 0 . int c ; 3 1 . 32 . 33 . 3 4 . 3 5 . 3 6 . 37 . 3 8 . 3 9 . 4 0 . 41. 42 . } } c = a + b;

System . ou t . println ( "O resultado da operacao e ' : • + c ) ; bat-;

System . ou t . println ( "Nivel da bateria: • + bat) ;

if (bat == 1 ) {

System .out .println( "Bateria fraca, recarregar ! • ) ;

}

i f (bat == O ) {

System . o u t . println ( "Robo danificado ! • ) ;

}

4 3 . public void subtrai (int a , int b ) { 4 4 . if (bat >=1) { 4 5 . 46 . 47 . 4 8 . int c ; c = a - b ;

System . ou t . println ( "O resultado da operacao e ' : " + c ) ;

' -

CAPITULO 4 - CONCEITOS DE PROGRAMAÇAO

49 . 5 0 . 51. 5 2 . 5 3 . 5 4 . 5 5 . 5 6 . 5 7 . 5 8 . 5 9 . 6 0 . 6 1 . 6 2 . 6 3 . 6 4 . 6 5 . 6 6 . 6 7 . 6 8 . 6 9 . 7 0 . 71. 7 2 . 73 . 74. 75. 7 6 . 7 7 . 78 . 7 9 . 8 0 . 8 1 . 8 2 . 8 3 . 8 4 . 8 5 . 8 6 . 8 7 . 8 8 . }

System . o u t . println( "Nivel da bateria: " + bat ) ;

}

if (bat == 1) {

System.out.println( "Bateria fraca, recarregar ! " ) ;

}

if (bat == 0 ) {

System.out. println ( "Robo danificado ! " ) ;

} }

public void multiplica( int a, int b) {

}

i f (bat >=1) { int c ;

}

c = a * b;

System . o u t . println ( "O resultado da operacao e ' : " + c ) ;

bat-;

System . o u t . println( "Nivel da bateria: " + bat ) ;

if (bat == 1) {

System. out. println ( "Bateria fraca, recarregar ! " ) ;

}

if (bat == O ) {

System . out . println ( "Robo danificado ! " ) ;

}

public void divid e ( int a , int b) {

}

if (bat >=1) { int c ;

}

c = a I b;

System . ou t . println ( " O resultado da operacao e' : " + c) ;

bat-;

System . o u t . println( "Nivel da bateria: " + bat ) ; if (bat == 1 ) {

System . ou t . println ( "Bateria fraca, recarregar ! " ) ;

}

if (bat == 0 ) {

System.out.println ( "Robô danificado ! " ) ;

}

43

Nesse exemplo, pode-se verificar a criação de uma classe denominada Robo,

que herda os atributos e métodos da superclase Robo_superclase (linha 1 ) que possui os atributos declarados nas linhas 3 a 6. Os chamados métodos construtores são responsáveis pela criação das instâncias de classe, ou seja, novos objetos com as carac­ terísticas da classe Robo. Foram definidas duas formas de criação de instâncias: uma

sem passagem de parâmetros (linha 3) e outra com a passagem de parâmetros definindo nome, série e data (linha 9).

ATENÇÃO!

NOTA!

A palavra Robo refere-se ao nome da classe e deve ser escrita sem acento.

Método é a implementação ou a codificação em uma linguagem de programação de uma operaç,io de Ltm objeto.

O método mudaNome (linha 15) permite a alteração do nome do robô. Esse método recebe como parâmetro o novo nome que o robô deverá assumir. Esse método demonstra a característica de encapsulamento de dados da metodologia, ou seja, so­ mente é possível alterar o nome de um robô acessando-se esse método. Outros atributos de Robo, como o número de série, por exemplo, não poderão ser alterados. Uma vez definido quando da instanciação de um novo robô, o número de série não poderá mais ser alterado, visto que não há um método que permita esse tipo de alteração. Preserva­ se, assim, a integridade dos dados.

Robo também executa algumas operações aritméticas como, por exemplo, a soma de dois números inteiros fornecidos, exibindo o resultado. Isso foi implementado nas

linhas 27 a 42. A exibição do resultado se dá na linha 32, onde se mosn·a a literal: "O resultado da operação é : ", seguida do valor da variável c.

Quando da execução de uma operação aritmética, a bateria do robô, que se ini­ cia com a carga 5, é decrementada, o que denota um desgaste. Isso é feito pelo comando na linha 38. Após a execução de uma seqüência de quatro operações aritméticas, o

Robo atinge a carga da bateria igual a O (zero). Nesse caso, é exibida a mensagem:

"Robo danificado! " , por meio dos comandos nas linhas 39 a 4 1 .

A seqüência de código a seguir executa uma espécie de teste da classe Robo, no qual são criadas duas i.nstâncias da classe, Rl e R2, são chamados alguns métodos e são executadas algumas operações aritméticas.

1 . class TestaRobo

2 . {

3 . public static void main ( String [ ) args ) {

4 . System. out . println ( "Testando Robo" ) ;

5 . 6 . 7 . 8 . 9 . 1 0 . 1 1 . 12 . 1 3 . 1 4 . 1 5 . 1 6 . 17 . 1 8 .

Robo R1 = new Robo ( } ;

System. out . println ( "Robo : " + Rl . mostraNome ( ) ) ; Rl . soma ( 3 , 2 ) ;

R1 . subtrai ( 8 , 2 ) ;

R 1 . multiplica ( 3 , 4 ) ;

Rl . di vide ( 8 , 2 ) ;

Rl . di vide ( 6 , 3 ) ;

Robo R2 = new Robo ( "D2 8 8 " , 2 , " 0 5 / 1 1 / 2 0 02 " ) ;

System . o u t . println ( "Testando Robo" ) ;

System . o u t . println( "Robo : " + R2 . mostraNome ( ) ) ; R2 . soma ( 5 , 4 ) ;

R2 . multiplica ( 3 , 5 ) ;

' -

CAPITULO 4 - CONCEITOS DE PROGRAMAÇAO 45

1 9 . }

2 0 . }

A instanciação de um objeto da classe Robo é feita por meio do código que está nas linhas 5 e 1 3; em cada caso, foi usado um dos dois métodos constmtores possíveis. Deve-se notar a chamada de um método, como o que exibe o nome do robô (linha

6),

utilizando-se a notação: Objeto. método, no caso, Rl . mos traNome ( ) .

4.4

4.5

/ '"'