Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF...

41
Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF [email protected] Atualizado em Novembro/2008

Transcript of Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF...

Page 1: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Java Básico

Classes Abstratas e Interfaces

Marco Antonio,

Arquiteto de Software – TJDF

[email protected] em Novembro/2008

Page 2: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Classe abstrata

Recurso avançado da OO

Não pode ser instanciada

Deve ser instanciada através de uma subclasse concreta

Permite modelar com mais precisão as regras de negócio

Refinamento do projeto

O programador fica obrigado a utilizar as regras definidas pelo projetista

Pode ter a implementação para os métodos

Page 3: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Interface

Funciona como um contrato

Não pode ser instanciada

Pode ser instanciada através de uma classe que a implemente

Obriga o programador a usar os métodos já definidos

Não tem implementação, apenas a assinatura dos métodos

Muito útil para diminuir o acoplamento entre os vários módulos do sistema

Page 4: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Classe abstrata x Interface

Não existe uma regra geral que defina quando usar classes abstratas ou interfaces

• O nível de refinamento deve ser definido antes da implementação, o que diminui o risco de entrar num ciclo de refinamentos sem fim

Page 5: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Dica

Quando haja a possibilidade de reutilização de código, prefira classe abstrata

Se o código reaproveitado é muito pequeno, talvez seja mais interessante uma interface

Page 6: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Exemplo de classe abstrata

Vamos utilizar a classe Musico para ilustrar o conceito de classe abstrata

Baterista, Guitarrista e Baixista são nossas outras classes do modelo

Analise o relacionamento entre elas

Page 7: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Musico

package com.javabasico.classesabstratas;

public abstract class Musico {

public abstract String getNomeDoInstrumento();

public void afinarInstrumento() {

System.out.println("Estou afinando o/a " + getNomeDoInstrumento());

}

}

Page 8: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Baixista

package com.javabasico.classesabstratas;

public class Baixista extends Musico {

public String getNomeDoInstrumento() {

return "Baixo";

}

}

Page 9: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Guitarrista

package com.javabasico.classesabstratas;

public class Guitarrista extends Musico {

public String getNomeDoInstrumento() {

return "Guitarra";

}

}

Page 10: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Baterista

package com.javabasico.classesabstratas;

public class Baterista extends Musico {

public String getNomeDoInstrumento() {

return "Bateria";

}

}

Page 11: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

TesteDoMusico

package com.javabasico.classesabstratas;

public class TesteDoMusico {

public static void main(String[] args) {

Musico baixista = new Baixista();

baixista.afinarInstrumento();

Musico batera = new Baterista();

batera.afinarInstrumento();

Musico guitarrista = new Guitarrista();

guitarrista.afinarInstrumento();

}

}

Page 12: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Exemplo de interface

• Vamos utilizar a interface Veiculo no nosso exemplo

• Além desta, também teremos Carro, Moto e Caminhao

Page 13: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Veiculo

package com.javabasico.interfaces;

public interface Veiculo {

public int getQuantidadeDePneus();

public boolean isVeiculoDePasseio();

public int getPotencia();

}

Page 14: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Carro

package com.javabasico.interfaces;

public class Carro implements Veiculo {

public int getQuantidadeDePneus() {

return 4;

}

public boolean isVeiculoDePasseio() {

return true;

}

public int getPotencia() {

return 80;

}

}

Page 15: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Moto

package com.javabasico.interfaces;

public class Moto implements Veiculo{

public int getQuantidadeDePneus() {

return 2;

}

public boolean isVeiculoDePasseio() {

return true;

}

public int getPotencia() {

return 30;

}

}

Page 16: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Caminhao

package com.javabasico.interfaces;

public class Caminhao implements Veiculo {

public int getQuantidadeDePneus() {

return 6;

}

public boolean isVeiculoDePasseio() {

return false;

}

public int getPotencia() {

return 130;

}

}

Page 17: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

TesteDoVeiculo

package com.javabasico.interfaces;

public class TesteDoVeiculo {

public static void main(String[] args) {

Veiculo minhaMoto = new Veiculo();

}

}

Page 18: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Qual o problema?

Qual o problema da classe de teste?• Simples: uma interface não pode ser instanciada

– new Veiculo();• Não existe, no modelo anterior, um objeto do tipo Veiculo (o veículo é apenas conceitual)

• Existem apenas Carros, Motos e Caminhoes• Toda interface deve ter uma classe que a implemente, caso contrário, não faz sentido esse tipo de refinamento

Page 19: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

TesteDoVeiculopackage com.javabasico.interfaces;

public class TesteDoVeiculo {

public static void main(String[] args) {

Veiculo minhaMoto = new Moto();

System.out.println("Quantidade de cavalos da moto:" + minhaMoto.getPotencia());

Veiculo meuCarro = new Carro();

System.out.println("Quantidade de pneus do carro: " + meuCarro.getQuantidadeDePneus());

Veiculo meuCaminhao = new Caminhao();

System.out.println("O caminhão é veículo de passeio? " + meuCaminhao.isVeiculoDePasseio());

}

}

Page 20: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Exemplo Web

• Vamos imaginar a seguinte hierarquia de classes:– ControleHTML

• CaixaDeTexto• CaixaDeChecagem• Outros componentes HTML

• O ControleHTML terá os atributos comuns a todos os controles web (nome, valor) e deverá ser definido como abstract, porque o método getCodigoHTML não tem implementação.

• No momento de gerar a página HTML iremos instanciar o componente concreto (caixas de texto, comboboxes, caixas de checagem, botoes, etc).

• Para cada componente, teremos uma saída diferente para o método getCodigoHTML.

Page 21: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

ControleHTMLpackage com.javabasico.classesabstratas;

public abstract class ControleHTML {

private String nome;

private String valor;

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

public String getValor() {

return valor;

}

public void setValor(String valor) {

this.valor = valor;

}

public abstract String getCodigoHTML();

}

Page 22: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

CaixaDeChecagem

package com.javabasico.classesabstratas;

public class CaixaDeChecagem extends ControleHTML {

public String getCodigoHTML() {

StringBuilder html = new StringBuilder();

html.append("<input type=\"checkbox\"");

html.append("name=");

html.append(getNome());

html.append("\"value=\"");

html.append(getValor());

html.append("\">");

return html.toString();

}

}

Page 23: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

CaixaDeTexto

package com.javabasico.classesabstratas;

public class CaixaDeTexto extends ControleHTML { public String getCodigoHTML() { StringBuilder html = new StringBuilder(); html.append("<input type=\"text\""); html.append("name=\""); html.append(getNome()); html.append("\" value=\""); html.append(getValor()); html.append("\" >"); return html.toString(); }}

Page 24: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

PaginaWeb

package com.javabasico.classesabstratas;

public class PaginaWeb { public static void main(String[] args) { ControleHTML caixaDeTexto = new CaixaDeTexto(); caixaDeTexto.setNome("txtNome"); caixaDeTexto.setValor("Marco"); ControleHTML caixaDeChecagem = new CaixaDeChecagem(); caixaDeChecagem.setNome("chkUsuarioCadastrado"); caixaDeChecagem.setValor("1"); System.out.println(caixaDeTexto.getCodigoHTML()); System.out.println(caixaDeChecagem.getCodigoHTML()); }}

Page 25: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Exemplo com interfaces

• No próximo exemplo teremos as formas geométricas conforme a hierarquia:– FormaGeometrica

• Triangulo• Quadrado• Retangulo• Etc...

• A interface principal terá os métodos desenhar e apagar, claro, sem a implementação, que será feita nas classes a seguir.

Page 26: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

FormaGeometrica

package com.javabasico.interfaces;

public interface FormaGeometrica {

public void desenhar();

public void apagar();

}

Page 27: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Triangulo

package com.javabasico.interfaces;

public class Triangulo implements FormaGeometrica {

public void apagar() {

System.out.println("Estou apagando o triângulo...");

}

public void desenhar() {

System.out.println("Estou desenhando um triângulo...");

}

}

Page 28: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Quadrado

package com.javabasico.interfaces;

public class Quadrado implements FormaGeometrica {

public void apagar() {

System.out.println("Estou apagando o quadrado.");

}

public void desenhar() {

System.out.println("Estou desenhando um quadrado.");

}

}

Page 29: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

TesteFormasGeometricas

package com.javabasico.interfaces;

public class TesteFormasGeometricas { public static void main(String[] args) { FormaGeometrica forma = new Triangulo(); forma.desenhar(); forma.apagar(); }}

Page 30: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Ligação dinâmica

• Devemos observar que criamos um objeto do tipo FormaGeometrica e que dinamicamente a linguagem trocou para a classe Triangulo.

• Esse comportamento é verificado nas interfaces e nas classes.

Page 31: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

TesteFormasGeometricas

package com.javabasico.interfaces;

public class TesteFormasGeometricas { public static void main(String[] args) { FormaGeometrica forma = new Triangulo(); forma.desenhar(); forma.apagar(); // forma = new Quadrado(); forma.desenhar(); forma.apagar(); }}

Page 32: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Sua vez

• Crie mais duas formas geométicas e teste tudo na nossa classe.

Page 33: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Curiosidades

• O mesmo objeto (forma) teve dois comportamentos diferentes, executando métodos em classes diferentes.

• No próximo exemplo teremos mais uma curiosidade, passando uma interface como parâmetro.

• O SoftwareGrafico irá aceitar somente implementações de FormaGeometrica.

• Para testar, crie a classe Elipse com os mesmos métodos da FormaGeometrica, mas não implemente a interface. Tente passá-la como parâmetro. O que acontece?

Page 34: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

SoftwareGrafico

package com.javabasico.interfaces;

public class SoftwareGrafico { public void adicionarForma(FormaGeometrica forma) { forma.desenhar(); }

public void removerForma(FormaGeometrica forma) { forma.apagar(); }}

Page 35: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

TesteSoftwareGrafico

package com.javabasico.interfaces;

public class TesteSoftwareGrafico {

public static void main(String[] args) {

SoftwareGrafico photoshop = new SoftwareGrafico();

Quadrado umQuadrado = new Quadrado();

photoshop.adicionarForma(umQuadrado);

//

Triangulo umTriangulo = new Triangulo();

photoshop.adicionarForma(umTriangulo);

//

photoshop.removerForma(umTriangulo);

photoshop.removerForma(umQuadrado);

}

}

Page 36: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Dúvidas?

Page 37: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Impressora

package com.javabasico.classesabstratas;

public interface Impressora {

void imprimir();

void imprimir(String texto);

}

Page 38: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Lexmark

package com.javabasico.classesabstratas;

public class Lexmark implements Impressora {

@Override

public void imprimir() {

System.out.println("Estou imprimindo na Lexmark...");

}

@Override

public void imprimir(String texto) {

System.out.println("Estou imprimindo o texto: " + texto + "na Lexmark.");

}

}

Page 39: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Teste

package com.javabasico.classesabstratas;

public class TesteDaImpressora {

public static void main(String args[]) {

Impressora l = new Lexmark();

l.imprimir();

l.imprimir("Alguma coisa");

}

}

Page 40: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Classes Anônimas

package com.javabasico.classesabstratas;

public class TesteImpressoraAnonima {

public static void main(String[] args) {

Impressora i = new Impressora() {

@Override

public void imprimir() {

System.out.println("Imprimindo pela classe anonima");

}

@Override

public void imprimir(String texto) {

System.out.println("Classe anonima: " + texto);

}

};

i.imprimir();

i.imprimir("Algum texto");

}

}

Page 41: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.

Exercício

• Cria uma classe para representar as peças de um veículo. Essa deverá ser uma classe genérica e abstrata (ou interface).

• Em seguida crie as peças, que serão subclasses (porta, vidro, lanterna, retrovisor).

• Por fim, crie uma classe de teste e monte um carro com essas peças.