A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Classes Abstratas e Interfaces

Apresentações semelhantes


Apresentação em tema: "Classes Abstratas e Interfaces"— Transcrição da apresentação:

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

2 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

3 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

4 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

5 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

6 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

7 Musico package com.javabasico.classesabstratas;
public abstract class Musico { public abstract String getNomeDoInstrumento(); public void afinarInstrumento() { System.out.println("Estou afinando o/a " + getNomeDoInstrumento()); }

8 Baixista package com.javabasico.classesabstratas;
public class Baixista extends Musico { public String getNomeDoInstrumento() { return "Baixo"; }

9 Guitarrista package com.javabasico.classesabstratas;
public class Guitarrista extends Musico { public String getNomeDoInstrumento() { return "Guitarra"; }

10 Baterista package com.javabasico.classesabstratas;
public class Baterista extends Musico { public String getNomeDoInstrumento() { return "Bateria"; }

11 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(); }

12 Exemplo de interface Vamos utilizar a interface Veiculo no nosso exemplo Além desta, também teremos Carro, Moto e Caminhao

13 Veiculo package com.javabasico.interfaces; public interface Veiculo {
public int getQuantidadeDePneus(); public boolean isVeiculoDePasseio(); public int getPotencia(); }

14 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;

15 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;

16 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;

17 TesteDoVeiculo package com.javabasico.interfaces;
public class TesteDoVeiculo { public static void main(String[] args) { Veiculo minhaMoto = new Veiculo(); }

18 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

19 TesteDoVeiculo package 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()); }

20 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.

21 ControleHTML package 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();

22 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(); }

23 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(); }

24 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()); }

25 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.

26 FormaGeometrica package com.javabasico.interfaces;
public interface FormaGeometrica { public void desenhar(); public void apagar(); }

27 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...");

28 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.");

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

30 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.

31 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(); }

32 Sua vez Crie mais duas formas geométicas e teste tudo na nossa classe.

33 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?

34 SoftwareGrafico package com.javabasico.interfaces;
public class SoftwareGrafico { public void adicionarForma(FormaGeometrica forma) { forma.desenhar(); } public void removerForma(FormaGeometrica forma) { forma.apagar();

35 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); }

36 Dúvidas?

37 Impressora package com.javabasico.classesabstratas;
public interface Impressora { void imprimir(); void imprimir(String texto); }

38 Lexmark package com.javabasico.classesabstratas;
public class Lexmark implements Impressora { @Override public void imprimir() { System.out.println("Estou imprimindo na Lexmark..."); } public void imprimir(String texto) { System.out.println("Estou imprimindo o texto: " + texto + "na Lexmark.");

39 Teste package com.javabasico.classesabstratas;
public class TesteDaImpressora { public static void main(String args[]) { Impressora l = new Lexmark(); l.imprimir(); l.imprimir("Alguma coisa"); }

40 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"); } public void imprimir(String texto) { System.out.println("Classe anonima: " + texto); }; i.imprimir(); i.imprimir("Algum texto");

41 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.


Carregar ppt "Classes Abstratas e Interfaces"

Apresentações semelhantes


Anúncios Google