Prévia do material em texto
<p>POO</p><p>Prof. Thiago Muniz</p><p>Classes Abstratas e Interface</p><p>Classe e Métodos Abstratos</p><p>A palavra abstrato em OO, é sinônimo de não-implementação, isto é algo que não se pode instanciar , no caso de Classes. Para métodos é algo que não se define a implementação.</p><p>Classes Abstratas</p><p>As classes abstratas, são utilizadas quando temos a certeza de que não será necessária uma instância daquela classe (super-classe), mas precisamos garantir que as sub-classes, terão aquela estrutura. Elas são na verdade criadas para serem estendidas (terem classes filhas).</p><p>Classe Abstrata</p><p>Em java, uma classe abstrata é criada usado o modificador abstract na definição de uma classe.</p><p>Uma classe abstrata pode ter:</p><p>atributos;</p><p>métodos concretos;</p><p>métodos abstratos;</p><p>Exemplo</p><p>Na UML ,o nome da classe em itálico indica que a Classe é Abstrata</p><p>Métodos abstratos</p><p>São métodos que têm apenas a assinatura, sem a implementação . A implementação é obrigatória na subclasse, no caso de herança, ou ainda no caso de Interface.</p><p>Exemplo</p><p>método abstrato</p><p>Classe abstrata</p><p>Uma classe abstrata nada mais é do que uma especificação conceitual para outras classes. Isso que dizer que nunca iremos instanciá-la.</p><p>Ela apenas fornece um modelo para geração de outras classes. Esta nunca está completa, ou seja, servirá apenas para criação de funcionalidades genéricas de casses filhas. Podemos também chamar as classes abstratas de super classe.</p><p>Por exemplo, é sabido que Pessoa Física e Pessoa Jurídica possuem o atributo nome como uma informação em comum. Dentre dezenas de informações, a mais comentada que gera uma grande diferença entre as duas são CPF para Física e CNPJ para Jurídica.</p><p>Este é um bom motivo para que se defina uma classe abstrata. Ao invés de definir o atributo nome para as duas classes, o que gera redundância, cria-se uma classe abstrata e insere um atributo nome dentro dela. Feito isso, haverá a herança das propriedades para as classes filhas, Física e Jurídica, desta maneira ficam definidas dentro de Física o atributo CPF e para Jurídica o CNPJ. O atributo nome vem automaticamente pela super classe.</p><p>public abstract class Pessoa{</p><p>protected String xNome;</p><p>protected Pessoa(){</p><p>xNome = "Sem nome";</p><p>}</p><p>protected Pessoa(String nome){</p><p>xNome = nome;</p><p>}</p><p>public String getNome(){</p><p>return xNome;</p><p>}</p><p>}</p><p>public class Fisica extends Pessoa{</p><p>private String xCPF;</p><p>public Fisica(){</p><p>super();</p><p>}</p><p>public Fisica(String nome){</p><p>super(nome);</p><p>}</p><p>public String getCPF(){</p><p>return  xCPF;</p><p>}</p><p>public String getNome(){</p><p>return super.getNome();</p><p>}</p><p>}</p><p>public class Juridica extends Pessoa{</p><p>private String xCNPJ;</p><p>public Juridica(){</p><p>super();</p><p>}</p><p>public Juridica(String nome){</p><p>super(nome);</p><p>}</p><p>public String getCNPJ(){</p><p>return  xCNPJ;</p><p>}</p><p>public String getNome(){</p><p>return super.getNome();</p><p>}</p><p>}</p><p>class Principal{</p><p>public static void main(String[] args){</p><p>Fisica pessoa1 = new Fisica("Daniel");</p><p>System.out.println (pessoa1.getNome());</p><p>System.out.println (pessoa1.getCPF());</p><p>Juridica pessoa2 = new Juridica();</p><p>System.out.println (pessoa2.getNome());</p><p>System.out.println (pessoa2.getCNPJ());</p><p>}</p><p>}</p><p>Interface</p><p>Interface, é uma estrutura que representa uma classe abstrata “pura” em java</p><p>Não tem atributos ( só pode ter constantes estáticas)</p><p>Não tem construtor</p><p>Todos os métodos são abstratos e públicos</p><p>Não é declarada como class, e sim como interface</p><p>Interface</p><p>As interfaces servem para fornecer polimorfismo sem herança.</p><p>Uma classe pode implementar uma interface, mas apenas herdar de uma classe-mãe.</p><p>Em Java,Interface são declaradas com a palavra-chave interface.</p><p>Interface</p><p>Em Java, dizemos que uma Classe implementa (implements) uma Interface, quando queremos que esta classe use a interface.</p><p>public interface IObjetoGeometrico{}</p><p>public class Circulo implements IObjetoGeometrico</p><p>Exemplo</p><p>Perimetro = 2*Math.PI*raio</p><p>Área=Math.PI*raio*raio</p><p>Interface</p><p>Uma interface nada mais é do que um bloco de código definindo um tipo e os métodos e atributos que esse tipo deve possuir. Na prática o que acontece é que qualquer classe que quiser ser do tipo definido pela interface deve implementar os métodos dessa interface. A interface não contém nenhum código de implementação, apenas assinaturas de métodos e/ou atributos que devem ter seu código implementado nas classes que implementarem essa interface.</p><p>Interface</p><p>A Interface define um padrão para especificação do comportamento de classes. Porém, os métodos de uma interface são implementados de maneira particular a cada classe; ou seja, permitem expressar comportamento sem se preocupar com a implementação. Uma interface não possui atributos. Uma classe pode implementar várias interfaces, mas pode ter apenas uma superclasse.</p><p>public class TV {</p><p>private int tamanho;</p><p>private int canal;</p><p>private int volume;</p><p>private boolean ligada;</p><p>public TV(int tamanho) {</p><p>this.tamanho = tamanho;</p><p>this.canal = 0;</p><p>this.volume = 0;</p><p>this.ligada = false;</p><p>} // abaixo vem todos os métodos construtores get e set... // Encapsulamento</p><p>}</p><p>public interface ControleRemoto {</p><p>void mudarCanal(int canal);</p><p>void aumentarVolume (int taxa);</p><p>void diminuirVolume (int taxa);</p><p>boolean ligar();</p><p>boolean desligar();</p><p>}</p><p>Interface</p><p>Agora temos nossa interface e a definição do que é a TV, vamos desenvolver duas TVs diferentes, imaginando que fossem duas marcas completamente distintas e que uma não tem nenhuma relação com a outra. Como ambas as TVs irão implementar a interface ControleRemoto, então, no corpo das duas classes devem conter todos os métodos da interface. No exemplo usado abaixo, apenas implementaremos os métodos ligar e desligar.</p><p>Exemplo</p><p>A TV modelo 001 é uma TV simples, sem muitos recursos que quando acionarmos o comando desligar irá simplesmente desligar</p><p>public class ModeloTV001 extends TV implements ControleRemoto {</p><p>public final String MODELO = "TV001";</p><p>public ModeloTV001(int tamanho) {</p><p>super(tamanho); }</p><p>public void desligar() {</p><p>super.setLigada(false); }</p><p>public void ligar() {</p><p>super.setLigada(true); }</p><p>public void aumentarVolume(int taxa) { }</p><p>public void diminuirVolume(int taxa) { }</p><p>public void mudarCanal(int canal) { }</p><p>}</p><p>Exemplo</p><p>O modelo X é uma TV mais moderna, que quando acionarmos o comando desligar irá apresentar uma mensagem dizendo "tchau!".</p><p>public class ExemploInterfaceamento {</p><p>public static void main(String[] args) {</p><p>ModeloTV001 tv1 = new ModeloTV001(21);</p><p>ModeloSDX tv2 = new ModeloX (42);</p><p>tv1.ligar();</p><p>tv2.ligar();</p><p>System.out.print("TV1 - modelo " + tv1.MODELO + " está ");</p><p>System.out.println(tv1.isLigada() ? "ligada" : "desligada");</p><p>System.out.print("TV2 - modelo " + tv2.MODELO + " está ");</p><p>System.out.println(tv1.isLigada() ? "ligada" : "desligada");</p><p>// ambas as TVs estão ligadas e vamos desligá-las</p><p>System.out.println("Desligando modelo " + tv1.MODELO);</p><p>tv1.desligar();</p><p>System.out.println("Desligando modelo " + tv2.MODELO);</p><p>tv2.desligar();</p><p>} }</p><p>image1.png</p><p>image2.tiff</p><p>image3.emf</p><p>image4.png</p><p>image5.png</p><p>image6.png</p><p>image7.png</p>