• Nenhum resultado encontrado

Classes abstratas: não podem ser instanciadas. Poderoso Mecanismo de Abstração:

N/A
N/A
Protected

Academic year: 2021

Share "Classes abstratas: não podem ser instanciadas. Poderoso Mecanismo de Abstração:"

Copied!
14
0
0

Texto

(1)

Classes Abstratas

(2)

Classes Abstratas

 Classes abstratas: não podem ser instanciadas

 Poderoso Mecanismo de Abstração:

Permite a herança do código sem violar a noção de subtipo

Diz o que deve ter a subclasse, mas não diz como !

 A classe abstrata:

• código genérico, livre de particularidades

 As subclasses:

• detalhes particulares

(3)

Classes Abstratas

Métodos Abstratos:

Só a assinatura, sem corpo

Precisam ser implementados pelas subclasses (folhas)

•A classe abstrata enumera

características genéricas do modelo, mas não as implementa.

•A classe abstrata obriga subclasses

(folhas) a implementarem funcionalidades abstratas previstas em seu corpo.

•Para isto, cada subclasse se utiliza de

seus detalhes particulares.

(4)

Classes Abstratas

Exemplo:

Círculos, Quadrados e Triângulos.

Círculo x,y raio

move(x,y) { ... } mostra( ) { ... }

alteraDiâmetro(d) { ... }

Quadrado x,y

lado

move(x,y) { ... } mostra( ) { ... }

alteraLado(d) { ... }

Triângulo x,y

l1,l2,l3

move(x,y) mostra()

alteraLado1(l) { ... }

alteraLado2(l) { ... }

alteraLado3(l) { ... }

(5)

Classes Abstratas

Exemplo: Círculos, Quadrados e Triângulos.

Círculo x,y raio

move(x,y) { ... } mostra( ) { ... }

alteraDiâmetro(d) { ... }

Quadrado x,y

lado

move(x,y) { ... } mostra( ) { ... }

alteraLado(d) { ... }

Triângulo x,y

l1,l2,l3

move(x,y) mostra()

alteraLado1(l) { ... } alteraLado2(l) { ... } alteraLado3(l) { ... } Figuras

x,y

move(x,y)

mostra( )

(6)

Classes Abstratas

Exemplo:

Guarita de entrada, Guarita de saída.

Guarita de entrada ...

abrir( ) { ... } fechar( ) { ... } receber(v) { ... } liberar(v) { ... }

Guarita de saída ...

abrir( ) { ... }

fechar( ) { ... }

receber(v) { ... }

liberar(v) { ... }

(7)

Classes Abstratas

Exemplo: Guarita de entrada, Guarita de saída.

Entrada ...

abrir( ) { ... } fechar( ) { ... } receber(v) { ... } liberar(v) { ... }

Saída ...

abrir( ) { ... } fechar( ) { ... } receber(v) { ... } liberar(v) { ... } Guarita

...

abrir( )

fechar( )

receber(v)

liberar(v)

(8)

Classes Abstratas

RoboAbstrato nomeDoRobô;

posiçãoXAtual,posiçãoYAtual;

direçãoAtual;

RoboAbstrato(n,px,py,d) { ... } move( ) { ... }

move(passos)

moveX(int passos) { ... } moveY(int passos) { ... }

mudaDireção(novaDireção) { ... } qualDireçãoAtual( ) { ... }

toString( ) { ... }

método abstrato: não sabemos

exatamente como um robô irá

implementar seus movimentos

(9)

Classes Abstratas

abstract class RoboAbstrato { private String nomeDoRobo;

private int posiçãoXAtual,posiçãoYAtual;

private short direçãoAtual;

RoboAbstrato(String n,int px,int py,short d) { ... } public void move() { move(1); }

public abstract void move(int passos);

public void moveX(int passos) { ... } public void moveY(int passos) { ... }

public void mudaDireção(short novaDireção) { ... } public short qualDireçãoAtual() { ... }

public String toString() { ... } }

RoboAbstrato.java

A classe é abstrata, pois possui ao menos um método abstrato.

Não existem “campos abstratos”.

Um método abstrato pode ser chamado a partir de outro: no momento da chamada, a

subclasse haverá sobreposto o método abstrato.

Um construtor não pode ser abstrato: seu código é

necessário para inicializar

corretamente os campos da

classe abstrata.

(10)

Classes Abstratas

RoboAbstrato ....

RoboSimples

.... RoboABateria

....

Cada subclasse de RoboAbstrato implementa move(passos) de uma forma particular:

Robô simples apenas atualiza as coordenadas,

Robô a bateria consome energia.

(11)

Classes Abstratas

class RoboSimples extends RoboAbstrato { RoboSimples(String n,int px,int py,short d) { super(n,px,py,d); }

public void move(int passos)

{ switch(qualDireçãoAtual()) {

case 0: moveX(+passos); break;

case 90: moveY(+passos); break;

case 180: moveX(-passos); break;

case 270: moveY(-passos); break; } }

} // fim da classe RoboSimples

RoboSimples.java

RobôSimples herda todas as caracerísticas de

RobôAbstrato, mas deve

implementar move( passos )

para que possa ser instanciada.

(12)

Classes Abstratas

class RoboABateria extends RoboAbstrato { private long energia;

RoboABateria(String n,int px,int py,short d,long e) { super(n,px,py,d); energia = e; }

public void move(int passos) {

long energiaASerGasta = passos*10;

if (energiaASerGasta <= energia) { switch(qualDireçãoAtual()) {

case 0: moveX(+passos); break;

...

case 315: moveY(-passos); moveX(+passos); break; } energia -= energiaASerGasta;

} }

public String toString() { ... }

} RoboABateria.java

Robô que consome

energia em seus

movimentos

(13)

Classes Abstratas

class DemoRobos {

public static void main(String[] argumentos) { ....

RoboAbstrato imag = new RoboAbstrato("Imaginário",0,0,(short)180);

} // fim do método main

} // fim da classe DemoRobos

DemoRobos.java

F:\>javac DemoRobos.java

DemoRobos.java:34: RoboAbstrato is abstract; cannot be instantiated RoboAbstrato imag = new RoboAbstrato("Imaginßrio",0,0,(short)180);

^

1 error

(14)

Classes Abstratas

 Exercício:

 Implementar a classe abstrata FiguraPlana, contendo os métodos abstratos area() e perimetro() , e as subclasses Quadrado, Triangulo, Losango e Circulo.

 Testar as novas classes usando um ArrayList<FiguraPlana>.

Criar instancias variadas de figuras, adicionar ao arraylist,

listar as figuras incluídas no arraylist e totalizar a área e o

perímetro delas.

Referências

Documentos relacionados

Na função punitiva, ou de desestímulo do dano moral, olha-se para o lesante, de tal modo que a indenização represente advertência, sinal de que a sociedade

Monitoria em disciplinas vinculadas ao Curso de Fisioterapia, exercida por um período de, no mínimo, 1 (um) semestre letivo, com dedicação mínima de 10 (dez) horas semanais.

Uma vez identificada as ações antrópicas negativas como desmatamento, expansão imobiliária, lançamento de efluentes líquidos domésticos e acúmulo de resíduos

Fica estabelecido que no caso de não ser efetuado pela empresa o pagamento dos salários até o quinto dia útil do mês subseqüente ao vencido, bem como do 13º salário e

Este trabalho busca discutir uma tendência dos últimos tempos: a utilização de filmes cinematográficos como um meio alternativo para a inserção, divulgação e reforço das

La Punta para Acabamiento es una herramienta rotativa desechable empleada para retirar residuos de cementos o resinas de la superficie dental, recuperando las características de

2006], tornando-as genéricas (abstratas) para que possam ser utilizadas (quando instanciadas) em documentos de requisitos orientados a aspectos, qualquer que seja

• Projeção de classes genéricas que podem ser especializadas em classes mais particulares3. • Classes especializadas reutilizam o código das