Java Básico Classes Abstratas e Interfaces Marco Antonio, Arquiteto de Software TJDF ma@marcoreis.eti.br Novembro/2005
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
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
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
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
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
Musico package com.javabasico.classesabstratas; public abstract class Musico { public abstract String getnomedoinstrumento(); public void afinarinstrumento() { System.out.println("Estou afinando o/a " + getnomedoinstrumento());
Baixista package com.javabasico.classesabstratas; public class Baixista extends Musico { public String getnomedoinstrumento() { return "Baixo";
Guitarrista package com.javabasico.classesabstratas; public class Guitarrista extends Musico { public String getnomedoinstrumento() { return "Guitarra";
Baterista package com.javabasico.classesabstratas; public class Baterista extends Musico { public String getnomedoinstrumento() { return "Bateria";
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();
Exemplo de interface Vamos utilizar a interface Veiculo no nosso exemplo Além desta, também teremos Carro, Moto e Caminhao
Veiculo package com.javabasico.interfaces; public interface Veiculo { public int quantidadedepneus(); public boolean isveiculodepasseio(); public int quantidadedecavalos();
Carro package com.javabasico.interfaces; public class Carro implements Veiculo { public int quantidadedepneus() { return 4; public boolean isveiculodepasseio() { return true; public int quantidadedecavalos() { return 80;
Moto package com.javabasico.interfaces; public class Moto implements Veiculo{ public int quantidadedepneus() { return 2; public boolean isveiculodepasseio() { return true; public int quantidadedecavalos() { return 30;
Caminhao package com.javabasico.interfaces; public class Caminhao implements Veiculo { public int quantidadedepneus() { return 6; public boolean isveiculodepasseio() { return false; public int quantidadedecavalos() { return 130;
TesteDoVeiculo package com.javabasico.interfaces; public class TesteDoVeiculo { public static void main(string[] args) { Veiculo minhamoto = new Veiculo();
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
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.quantidadedecavalos()); Veiculo meucarro = new Carro(); System.out.println("Quantidade de pneus do carro: " + meucarro.quantidadedepneus()); Veiculo meucaminhao = new Caminhao(); System.out.println("O caminhão é veículo de passeio? " + meucaminhao.isveiculodepasseio());
Dúvidas?