Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF...
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/1.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/2.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/3.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/4.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/5.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/6.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/7.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/8.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/9.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/10.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/11.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/12.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/13.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/14.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/15.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/16.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/17.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/18.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/19.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/20.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/21.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/22.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/23.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/24.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/25.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/26.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/27.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/28.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/29.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/30.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/31.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/32.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/33.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/34.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/35.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/36.jpg)
Dúvidas?
![Page 37: Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software – TJDF ma@marcoreis.net Atualizado em Novembro/2008.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/37.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/38.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/39.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/40.jpg)
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.](https://reader036.fdocuments.net/reader036/viewer/2022082919/552fc0fb497959413d8b97cd/html5/thumbnails/41.jpg)
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.