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

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

Embed Size (px)

Citation preview

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.