java básico classes abstratas e interfaces - marcoreis.net · java básico classes abstratas e...
TRANSCRIPT
Java Básico
Classes Abstratas e Interfaces
Marco Antonio,Arquiteto de Software – TJDF
[email protected]/2005
Classe abstrata
Recurso avançado da OONão pode ser instanciadaDeve ser instanciada através de uma subclasse concretaPermite modelar com mais precisão as regras de negócioRefinamento do projetoO programador fica obrigado a utilizar as regras definidas pelo projetistaPode ter a implementação para os métodos
Interface
Funciona como um contratoNão pode ser instanciadaPode ser instanciada através de uma classe que a implementeObriga o programador a usar os métodos já definidosNão tem implementação, apenas a assinatura dos métodosMuito ú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 interfacesO 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 abstrataSe 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 abstrataBaterista, Guitarrista e Baixista são nossas outras classes do modeloAnalise o relacionamento entre elas
Musicopackage com.javabasico.classesabstratas;
public abstract class Musico { public abstract String getNomeDoInstrumento();
public void afinarInstrumento() { System.out.println("Estou afinando o/a " + getNomeDoInstrumento()); }}
Baixistapackage com.javabasico.classesabstratas;
public class Baixista extends Musico { public String getNomeDoInstrumento() { return "Baixo"; }}
Guitarristapackage com.javabasico.classesabstratas;
public class Guitarrista extends Musico { public String getNomeDoInstrumento() { return "Guitarra"; }}
Bateristapackage com.javabasico.classesabstratas;
public class Baterista extends Musico { public String getNomeDoInstrumento() { return "Bateria"; }}
TesteDoMusicopackage 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
Veiculopackage com.javabasico.interfaces;
public interface Veiculo {
public int quantidadeDePneus();
public boolean isVeiculoDePasseio();
public int quantidadeDeCavalos();
}
Carropackage com.javabasico.interfaces;
public class Carro implements Veiculo { public int quantidadeDePneus() { return 4; }
public boolean isVeiculoDePasseio() { return true; }
public int quantidadeDeCavalos() { return 80; }}
Motopackage com.javabasico.interfaces;
public class Moto implements Veiculo{ public int quantidadeDePneus() { return 2; }
public boolean isVeiculoDePasseio() { return true; }
public int quantidadeDeCavalos() { return 30; }}
Caminhaopackage com.javabasico.interfaces;
public class Caminhao implements Veiculo { public int quantidadeDePneus() { return 6; }
public boolean isVeiculoDePasseio() { return false; }
public int quantidadeDeCavalos() { return 130; }}
TesteDoVeiculopackage 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 CaminhoesToda interface deve ter uma classe que a implemente, caso contrário, não faz sentido esse tipo de refinamento
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.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?