Programao Orientada a Objetos Classes Abstratas Prof Isabel
Programação Orientada a Objetos* Classes Abstratas Prof. Isabel Cafezeiro isabel@dcc. ic. uff. br http: //www. dcc. ic. uff. br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC
Classes Abstratas z Classes abstratas: não podem ser instanciadas y. 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 ! y. A classe abstrata: xcódigo genérico, livre de particularidades y. As subclasses: xdetalhes particulares
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.
Classes Abstratas Exemplo: Círculos, Quadrados e Triângulos. Triângulo Círculo Quadrado x, y raio move(x, y) {. . . } mostra( ) {. . . } altera. Diâmetro(d) {. . . } x, y lado move(x, y) {. . . } mostra( ) {. . . } altera. Lado(d) {. . . } x, y l 1, l 2, l 3 move(x, y) mostra() altera. Lado 1(l) {. . . } altera. Lado 2(l) {. . . } altera. Lado 3(l) {. . . }
Classes Abstratas Exemplo: Círculos, Quadrados e Triângulos. Figuras x, y move(x, y) mostra( ) Triângulo Círculo Quadrado x, y raio move(x, y) {. . . } mostra( ) {. . . } altera. Diâmetro(d) {. . . } x, y lado move(x, y) {. . . } mostra( ) {. . . } altera. Lado(d) {. . . } x, y l 1, l 2, l 3 move(x, y) mostra() altera. Lado 1(l) {. . . } altera. Lado 2(l) {. . . } altera. Lado 3(l) {. . . }
Classes Abstratas Exemplo: Guarita de entrada, Guarita de saída. Guarita de entrada Guarita de saída . . . abrir( ) {. . . } fechar( ) {. . . } receber(v) {. . . } liberar(v) {. . . }
Classes Abstratas Exemplo: Guarita de entrada, Guarita de saída. Guarita. . . abrir( ) fechar( ) receber(v) liberar(v) Entrada Saída . . . abrir( ) {. . . } fechar( ) {. . . } receber(v) {. . . } liberar(v) {. . . }
Classes Abstratas Robo. Abstrato nome. Do. Robô; posição. XAtual, posição. YAtual; direção. Atual; Robo. Abstrato(n, px, py, d) {. . . } move(passos) move. X(int passos) {. . . } move. Y(int passos) {. . . } muda. Direção(nova. Direção) {. . . } qual. Direção. Atual( ) {. . . } to. String( ) {. . . } método abstrato: não sabemos exatamente como um robô irá implementar seus movimentos
Classes Abstratas abstract class Robo. Abstrato { private String nome. Do. Robô; private int posição. XAtual, posição. YAtual; private short direção. Atual; A classe é abstrata, pois possui ao menos um método abstrato. Não existem “campos abstratos”. Robo. Abstrato(String n, int px, int py, short d) {. . . } public void move() { move(1); } public abstract void move(int passos); public void move. X(int passos) {. . . } public void move. Y(int passos) {. . . } public void muda. Direção(short nova. Direção) {. . . } public short qual. Direção. Atual() {. . . } public String to. String() {. . . } } Um construtor não pode ser abstrato: seu código é necessário para inicializar corretamente os campos da classe abstrata. Um método abstrato pode ser chamado a partir de outro: no momento da chamada, a subclasse haverá sobreposto o método abstrato. Robo. Abstrato. java
Classes Abstratas Robo. Abstrato. . Robo. Simples. . Robo. ABateria. . Cada subclasse de Robo. Abstrato implementa move(passos) de uma forma particular: Robô simples apenas atualiza as coordenadas, Robô a bateria consome energia.
Classes Abstratas class Robo. Simples extends Robo. Abstrato { Robo. Simples(String n, int px, int py, short d) { super(n, px, py, d); } public void move(int passos) { switch(qual. Direção. Atual()) { case 0: move. X(+passos); break; case 90: move. Y(+passos); break; case 180: move. X(-passos); break; case 270: move. Y(-passos); break; } } } // fim da classe Robo. Simples RobôSimples herda todas as caracerísticas de RobôAbstrato, mas deve implementar move( passos ) para que possa ser instanciada. Robo. Simples. java
Classes Abstratas class Robo. ABateria extends Robo. Abstrato { private long energia; Robo. ABateria(String n, int px, int py, short d, long e) { super(n, px, py, d); energia = e; } Robô que consome public void move(int passos) { energia em seus long energia. ASer. Gasta = passos*10; movimentos if (energia. ASer. Gasta <= energia) { switch(qual. Direção. Atual()) { case 0: move. X(+passos); break; . . . case 315: move. Y(-passos); move. X(+passos); break; } energia -= energia. ASer. Gasta; } } public String to. String() {. . . } } Robo. ABateria. java
Classes Abstratas class Demo. Robos { public static void main(String[] argumentos) {. . Robo. Abstrato imag = new Robo. Abstrato("Imaginário", 0, 0, (short)180); } // fim do método main } // fim da classe Demo. Robos. java F: >javac Demo. Robos. java: 34: Robo. Abstrato is abstract; cannot be instantiated Robo. Abstrato imag = new Robo. Abstrato("Imaginßrio", 0, 0, (short)180); ^ 1 error
Classes Abstratas z. Exercício: Implementar a classe abstrata Guarita, e as subclasses Guarita. De. Entrada e Guarita. De. Saída. Testar as novas classes usando a aplicação Estacionamento implementada na prova.
- Slides: 14