Interface
Transcrição
Interface
Programação Java III Prof. Vinicius Rosalen Parte III Métodos e Classes Abstratas • Resumo da aula anterior.... • Ao criarmos uma classe para ser estendida, – Às vezes codificamos alguns métodos para os quais não sabemos dar uma implementação, ou seja, • Um método que só subclasses saberão implementar • Uma classe deste tipo não pode ser instanciada pois sua funcionalidade está incompleta. – É como se tentássemos andar de carro sem ter as rodas construídas.... • Tal classe é dita abstrata. Métodos e Classes Abstratas • Resumo da aula anterior.... – Uma classe abstrata é utilizada quando desejase: • Fornecer uma interface comum a diversos membros de uma hierarquia de classes. • Não se preocupar COMO, apenas QUAL o contrato que deve ser obedecido... Java – Métodos e Classes Abstratas • Resumo da aula anterior.... – Classes Abstratas Método sem corpo { } Características - Abstração : suprimir detalhes para melhor compreensão - Classe abstrata - possui métodos abstratos - Força a implementação para que possa ser instanciada Todos os veículos possuem a ação de abastecer, mas a forma de abastecer (álcool, gasolina ou diesel) só é conhecida pelas filhas da herança Upcasting e Downcasting • Resumo da aula anterior.... – Outro dois conceitos bastante importantes é sobre: • A conversão de tipos na relação das classes em herança. – Os conceitos são de o polimorfismo de : • Downcasting e Upcasting Upcasting e Downcasting Em Java, Upcasting é automático A conversão de tipos para o topo da hierarquia é automático Ampliação (upcasting) é a conversão implícita de uma subclasse para uma superclasse Se tenho o tipo Pai e instancio o Filho é automático. O contrário não. Mas Downcasting deve ser explícito A conversão de tipos para as folhas da hierarquia deve ser explicitado. - O Pai está “contido” no filho. - Mas o filho não está “contido” no pai - Questão de reserva de memória. Upcasting e Downcasting • Vamos analisar um exemplo... “Máscara de visualização” Ponto “Área efetiva alocada” Ponto pt = new PontoColorido(0,0,1); PontoColorido px = (PontoColorido)pt; PontoColorido pt = px // UpCasting (Pai recebe o filho) px = pt; // Erro, filho não recebe o pai diretamente px = (PontoColorido)pt; // Downcast “Mas só enxerga as áreas em comum a ambos” Ponto pt2 = new Ponto(); PontoColorido py = (PontoColorido)pt2; System.out.println(py.cor); //ERRO de execução – espaços de memórias diferentes “cor é um atributo de PontoColorido, mas só foi alocado a área de Ponto” Java – Métodos e Classes Abstratas e Casting • Pra que usar isso...exemplo das figuras e classe Composta: – Os atributos F1 e F2 da classe Composta pertencem à classe Pai Figura – E no exemplo, eles recebem valores pertencentes às classes Filhas Circulo, Quadrado e Composta: Olha que legal, ele pode inclusive receber uma figura composta qualquer, não importa o formato, afinal ela também é uma Figura class Composta extends Figura { Figura F1, F2; . void Composta(Figura f1,f2) { F1 = f1; F2 = f2; }.. } ... Composta comp1 = new Composta(c1,q); Composta comp2 = new Composta(comp1,c2); ... – Isso é possível graças conversão implícita de tipo (upcasting), que é uma propriedade inerente aos objetos com relação de herança. Métodos e Classes Abstratas • Hoje nós vamos ampliar o nosso conhecimento em OO, conversando sobre: – A palavra reservada SUPER – Herança Múltipla e Interfaces – Exercícios • Vamos lá……. • Primeiramente vamos falar sobre a palavra reservada super... Palavra reservada “super” • Super pode ser utilizado explicitamente para: – Referenciar o construtor da superclasse • Para se referir ao construtor da classe pai, basta usar o operador – super( ). – Referenciar um outro método ou atributo da classe pai • Para se referir a elementos da classe pai, basta usar o operador – super Construtores de subclasse • Chamada Explícita ao construtor base 1: public class Circle 2: { 3: public double x,y,r; 4: public Circle(double x, double y, double r) { 5: this.x = x; 6: this.y = y; 7: this.r = r; 8: } 9: public Circle(double r){ 10: this(0.0,0.0,r); 11: } 12: } 1: public class GraphicCircle extends Circle 2: { 3: Color color; 2: public GraphicCircle 2b: (double x, double y, double r, Color color) { 3: super(x,y,r); 4: this.color = color; 5: } 6: } Herança em Java • Livro possui autor e paginas – (definidos na própria classe); • Livro possui nome e preço – (definidos na superclasse); • Livro pode receber mensagens ehGrande() – (definida na própria classe); • Livro pode receber mensagens ehCaro() – (definida na superclasse). • O que será impresso ? Construtores de subclasse • No caso de uma hierarquia de classes, – O que acontece se não chamar explicitamente o construtor da classe pai??? Ordem de construção • Relembrando... – Quando construímos um novo objeto, os seguintes passos são efetuados: • 1º: Os atributos da classe são zerados – inicializados com seus valores default: 0, false ou null; • 2º: Se a classe participa de alguma hierarquia, o construtor da superclasse é chamado; – Primeiro constrói o pai, depois o filho » Você existiria sem seus pais • 3º: Os atributos da classe recebem os seus valores iniciais (se especificados), na ordem em que foram definidos na classe; • 4º: O corpo do construtor da classe é chamado. Ordem de construção • No caso de não haver chamada explícita, – A linguagem Java chama o construtor padrão da superclasse. • Característica intrínseca de herança – Java chama implicitamente o construtor default da superclasse. – Se não existir um construtor default na superclasse, haverá um erro de compilação – No entanto, o finalizador da superclasse não é invocado. • Deve ser feito de forma explícita Construtores de subclasse • Chamada Implícita ao construtor base • O que será impresso ? Construtores de subclasse • O que será impresso ? Atributos e Métodos Ocultos • IMPORTANTE... • Pode-se redeclarar um atributo ou método de mesmo nome numa classe derivada. • Apesar do atributo ou método oculto ainda ser acessível, essa construção gera confusão sem trazer nenhum benefício. • Evite essa prática Chamada Explícita e Implícita class Super { • O Super() { System.out.println("Construtor Super"); } que será impresso? void teste() { System.out.println("Metodo Superclasse");} class ProgramaSuperExplicito { public static void main (String arg[]) { } System.out.println(“Heranca 2”); Subclasse sub = new Subclasse(); class Subclasse extends Super { sub.teste(); Subclasse() { } System.out.println("Construtor Subclasse"); } } void teste() { super.teste(); System.out.println("Metodo Subclasse"); } } Métodos sobrescritos podem chamar sua versão na superclasse usando a palavra super < (super.método() > Atributos Ocultos • O que será impresso? Herança Múltipla • Em algumas linguagens de programação OO: – As classes podem ter mais de um superclasse, • Herdando variáveis e métodos combinados de todas essas superclasses – Isto é chamado de herança múltipla – Herança Múltipla fornece margem para praticamente qualquer comportamento imaginável • Contudo complica bastante as definições de classes e o código para produzi-la, além do entendimento Herança Múltipla • Exemplo de utilização de herança múltipla ObjetoColorido Carro obtemCor() mudaCor() liga() acelera() CarroEsporteColorido Herança Múltipla • Outro exemplo de utilização herança múltipla extends extends Herança Múltipla • Outro exemplo de utilização de herança múltipla – Um gerente de banco pode assumir características de: • Funcionário, • Acionista e • Cliente em diferentes instantes. “ ” Herança Múltipla • Java simplifica a herança – Permitindo diretamente apenas a herança simples ou única das classes • Java NÃO permite múltipla herança de classe, – Pois foi verificado em outras linguagens que sua implementação é muito confusa • Um dos problemas que podem surgir... – É o conflito de nomes de atributos ou métodos herdados desse tipo de herança, além de heranças repetidas • Problemas de códigos… Herança Múltipla • Herança múltipla de classe não é permitida em Java ObjetoColorido Carro obtemCor() mudaCor() liga() acelera() extends extends CarroEsporteColorido Como construir então essa característica em Java? Interfaces • Em Java, os objetos podem implementar uma interface.... – As interfaces são como classes, mas não têm nenhuma implementação. • Define apenas as assinaturas de operações externamente visíveis que uma classe pode implementar, sem conter nenhuma especificação ou estrutura interna – Interfaces não possuem implementação, somente assinaturas de operações (100% abstratas); – Interfaces suportam herança, mesmo herança múltipla. • Interfaces podem herdar de outras interfaces, e suportam herança múltipla (enquanto classes suportam herança simples); – Mecanismo para prover flexibilidade devido à ausência de herança múltipla de classes; – Interfaces definem subtipos, enquanto a herança define as subclasses. Java – Herança Múltipla • Solução para herança múltipla – Escolha uma das classes para herdar; – Para as demais, crie interfaces e implemente-as; – Use composição ou agregação para fazer reuso. extends extends extends implements Interfaces • Características Gerais Importantes – Estabelece a interface (o contrato) de um conjunto de classes; – Permite a construção de código genérico: – Trabalha com qualquer objeto que implemente a interface; – Obriga programadores a implementar determinados métodos em suas classes para usar seu código. – São públicas (mesma regra das classes); – Classes utilizam implements ao invés de extends para implementar uma interface. – Todos os métodos são public & abstract; – Todos as variáveis são final & static, inicializados • isto é, apenas constantes Java - Class x Interface • Sintaxe para Classe e Interface em Java Interfaces não permitem declaração de atributos variantes (somente estáticos), enquanto que classes permitem outros. Interfaces estão mais ligadas a comportamento, enquanto que classes estão mais ligadas a implementação. Java - Interface • Resumindo: Membros da Interface – Métodos definidos na interface são automaticamente públicos e abstratos; – Atributos definidos na interface são automaticamente públicos e estáticos. Método sem corpo { } Interface ou classe abstrata? • Importante: Classes Abstratas X Interfaces – Você deve estar achando que classes abstratas e interfaces são conceitos parecidos e que podem ser usados com objetivos semelhantes. – Cuidado! • Uma classe pode estender uma única classe (que pode ser abstrata ou não), mas pode implementar várias interfaces. • Além disso, interfaces não permitem declaração de atributos variáveis (somente estáticos), enquanto que classes abstratas permitem. • Interfaces estão mais ligadas a comportamento, enquanto que classes abstratas estão mais ligadas a implementação. – Sempre que possível, use interfaces Interface ou classe abstrata? • Blz, – Tudo isso é bonito e legal, mas pra que eu tenho que ver isso...?? – Vamos analisar um exemplo para entender melhor porque a gente deve entender e usar interfaces Interface ou classe abstrata? • Imagine que temos um Hierarquia dos animais, e devemos simular animais em um ambiente. • Se analisarmos as relações ao lado, a classe Dog para um programa de ciências está OK.... • .. Mas e para programa que simule um Pet Shop??? Interface ou classe abstrata? • 1ª Opção: Métodos que simulam os comportamentos de um Pet (Animal de Estimação) implementados em Animal. – Prós: • Todas as subclasses possuirão esses comportamentos. • Uso do polimorfismo. – Contras: • Existem subclasses de Animal que não precisam desses comportamentos (Hippo, Lion, Tiger, Wolf) Interface ou classe abstrata? • 2ª Opção: Métodos abstratos que simulam os comportamentos de um Pet (Animal de Estimação) implementados em Animal. – Prós: • Todas as subclasses possuirão esses comportamentos; • Uso do polimorfismo; • Cada subclasse com seu próprio comportamento. – Contras: • Todas as subclasses concretas devem implementar os métodos abstratos. Interface ou classe abstrata? • 3ª Opção: Comportamentos de animais de estimação nas subclasses Dog e Cat. – Prós: • Comportamento de animal de estimação somente onde necessário; • Cada subclasse implementa o comportamento que quiser. – Contras: • Pode não haver uma padronização dos comportamentos Pet em uma subclasse. – Ex.: Se as classes forem implementadas por programadores diferentes. • Não pode usar polimorfismo para os comportamentos (métodos) dos animais de estimação. Interface ou classe abstrata? • 4ª Opção: Nova classe com comportamentos de animais de estimação – Prós: • Garante que todos os animais de estimação terão as mesmas definições de métodos; • Polimorfismo Interface ou classe abstrata? • 4ª Opção: Nova classe com comportamentos de animais de estimação – Contras: • Duas Superclasses; • Java NÃO implementa herança múltipla. Interface ou classe abstrata? • Solução: INTERFACE – É como uma classe abstrata, mas só tem: • Métodos abstratos, públicos • Campos finais estáticos, públicos Interfaces • Outra coisa legal que a gente pode fazer com interfaces está ligado ao polimorfismo.... • Interfaces permitem a construção de código genérico – Ou seja trabalhar com qualquer objeto que implemente a interface; • Em outras palavras.... – Posso passar qualquer objeto que implementa essa interface • Imagine as possibilidades... Interfaces • Lembram do nosso exemplo... − Com a utilização de interface para herança múltipla em Java, ele ficaria assim.. <<interface>> ObjetoColorido Carro Color obtemCor() liga() void mudaCor(Color cor) acelera() implements extends CarroEsporteColorido Color cor Java – Herança Múltipla • Implementação do Carro e Objeto Colorido Métodos sem corpo { } A implementação do método não está na interface mas sim na classe que a implements Java - Herança Múltipla Interface (utilização) • O que será impresso? AplicacaoDeCor Posso passar qualquer objeto que implementa essa interface.. Imagine as possibilidades... Como o parâmetro da função ehAzul é uma interface... ...qualquer classe que implementa esta interface pode ser passada como parâmetro O mail legal é que interface permitem a construção de código genérico: Trabalha com qualquer objeto que implemente a interface; Interfaces e Heranças • Outro conceito importante é que Interfaces suportam herança, mesmo herança múltipla. – Interfaces podem herdar de outras interfaces, e suportam herança múltipla (enquanto classes suportam herança simples); • Mecanismo para prover flexibilidade devido à ausência de herança múltipla de classes; Java - Interface • Hierarquias de interfaces – Uma interface pode estender outra – Uma classe pode implementar várias interfaces Pessoa é uma outra interface Método Pedala é abstract O método Pedala deve ser implementado nesta classe Java - Interface • Hierarquias de interfaces – Uma interface pode estender outra: Java - Interface • Importante: – Uma interface pode implementar uma classe abstrata • A implementação dos métodos abstratos da interface e da classe fica para os filhos Java - Interface • O que o código está fazendo? Mensuravel.java Compara.java MainCompara.java Interface - Permitindo a compatibilidade entre duas classes diferentes Exercícios • Blz... Agora é hora de exercitar..... • Tente resolver ou analisar os seguintes problemas... – Em dupla – Apresentar ao professor no final da aula – Pontuação em Atividades em sala de aula... – Faça o JAVADOC de todos os exercícios!!! Exercício 1. Crie um projeto e copie o conteúdo da classe do próximo slide para um arquivo chamado Mostra.java; 2. Compile e execute o código; 3. Analise os resultados; 4. Retire os marcadores de comentários “//”, e compile; 5. Por que o código não compila? 6. Utilizando implements, o que pode ser feito para que o método Nome das classes Cicrano e Beltrano sejam evocadas? 7. Utilizando herança simples, o que pode ser feito para que o método Nome das classes Cicrano e Beltrano sejam evocadas? 8. Sempre podemos optar por herança simples ou implements? class Fulano { public String Nome() { return "Fulano da Silva"; } } class Cicrano { public String Nome() { return "Cicrano da Veiga"; } } class Beltrano { public String Nome() { return "Beltrano da Slovinsky"; } } class Mostra { static void MostraNome(Fulano r) { System.out.println("***> "+r.Nome()+" <***"); } public static void main(String[] arg) { Fulano f=new Fulano(); Cicrano c=new Cicrano(); Beltrano b=new Beltrano(); MostraNome(f); //MostraNome(c); //MostraNome(b); } } Exercício • O que o código está fazendo? Analise o código, modifique, veja o que acontece.. Aplique as ideias que vimos... Musica.java Exercicio6.java Exercício • Implemente o cenário abaixo – Definir atributos, métodos, etc... 1/2 Exercício 2/2 • Utiliza e implementa uma interface para um robô – Exemplo: • abstract class RoboCop extends Pessoa implements Robo • Faça com que esse robô também implemente a interface Relógio Exercício • Implementar Hierarquia abaixo, com métodos simplificados – Definir atributos, métodos, etc... Olhar nos slides anteriores da aula... Interface Classes Exercício • Considere o diagrama de classes do slide seguinte: – a) Crie uma interface de nome Motorizado onde são declarados os métodos void ligarMotor() e void abastecer(int numLitros). – b) Implemente a interface Motorizado nas classes Aviao e Carro. – c) Escreva um pequeno programa de teste capaz de verificar a implementação anterior. – d) Crie uma interface de nome Conduzivel onde é declarado o método void curvar(float angulo). – e) Implemente a interface Conduzivel nas classes Aviao, Carro e Bicicleta. – f) Complete o programa de teste efetuado anteriormente por forma a testar estas últimas implementações. Exercício Exercício • Crie a seguinte hierarquia de classes: – Uma interface para representar qualquer forma geométrica, definindo métodos para cálculo do perímetro e cálculo da área da forma; – Uma classe abstrata para representar quadriláteros. Seu construtor deve receber os tamanhos dos 4 lados e o método de cálculo do perímetro já pode ser implementado; – Classes para representar retângulos e quadrados. A primeira deve receber o tamanho da base e da altura no construtor, enquanto a segunda deve receber apenas o tamanho do lado; – Uma classe para representar um círculo. Seu construtor deve receber o tamanho do raio. – No programa principal, crie quadrados, retângulos e círculos com tamanhos diferentes e armazene num vetor. Em seguida, imprima os dados (lados ou raio), os perímetros e as áreas de todas as formas. Exercício • Implementar classes Pessoa, Liquido e classes filhas desta; – Pessoa deve implementar o método beber(Liquido); – Criar outros atributos e métodos que se julgue necessários; – Imprimir estado da pessoa ao beber diferentes tipos de líquido; Exercício Exercício • Desenvolva as classes ao lado. – Crie uma classe ExemploBanco que faça operações nesse banco. – Pegue as informações via teclado ContaPoupança diaAniversário correção contaPoupança() corrigeSaldo() mostraSaldo() ContaDeBanco saldo contaDeBanco() deposito() retirada() mostraSaldo() ContaEspecial limite contaEspecial() mostraSaldo() Exercício Exercício Exercício Exercício • Identifique e explique o(s) erro(s) na classe a seguir. • Implemente as correções • Implemente uma classe que cria uma instância de EntradaNaAgenda e acesse o método toString() Exercício Exercício • Identifique e explique o(s) erro(s) na classe a seguir. • Implemente as correções • Implemente uma classe que cria uma instância de DiscoOtico e acesse os métodos toString() e capacidadeEmMegabytes() Exercício Exercício • O que o código está fazendo? Exercício • O que o código está fazendo? Exercício • O que o código está fazendo? Exercicio5.java Exercício • O que será impresso? Exercício • O que será impresso? Exercício • Considere o diagrama de classes do slide seguinte: – Crie as relações... – Escreva um pequeno programa de teste capaz de verificar a implementação anterior.