• Nenhum resultado encontrado

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

N/A
N/A
Protected

Academic year: 2022

Share "7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces"

Copied!
6
0
0

Texto

(1)

© ELFS 171

7. Classes Abstratas e Interfaces

Métodos e Classes Abstratas

• Como vimos anteriormente, subclasses podem redefinir (sobrepor) um método de sua superclasse.

• Para indicar que um método de uma classe deve necessariamente ser redefinido em cada uma de suas subclasses devemos usar o modificador abstract.

• Uma classe que contém um ou mais métodos abstratos deve ser declarada explicitamente como abstrata. Essa classe, no entanto, pode ter construtores e métodos concretos (não-abstratos).

• Se uma classe é declarada como abstract não podem ser criados objetos desta classe.

• Se uma subclasse é derivada de uma superclasse que contém um método abstrato e se esse método abstrato não for redefinido na subclasse, esse método permanece abstract na subclasse. Com isso, a subclasse deverá ser declarada explicitamente como abstract.

• Declarar um método como abstrato é uma forma de obrigar o programador a redefinir esse método em todas as subclasses para as quais se deseja criar objetos.

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

• Como um método abstrato deve ser redefinido nas subclasses, na superclasse ele não precisa ter implementação alguma.

Exemplo:

// Classe abstrata Empregado public abstract class Empregado {

private String nome;

private String familia;

public Empregado(String n, String f) {

nome = n;

familia = f;

}

public String getNome() { return nome; } public String getFamilia() { return familia; } public String toString() {

return nome + ' ' + familia;

}

public abstract double ganha();

}

Método abstrato. Deve ser implementado na subclasse.

Como a classe contém um método abstrato, ela deve ser declarada como abstrata.

Empregado.java

(2)

© ELFS 173

7. Classes Abstratas e Interfaces

• Vamos imaginar a seguinte hierarquia de classes:

onde Chefe, PorComissao, PorItem e PorHora são classes finais.

• Todas essas subclasses vão precisar redefinir o método ganha(). Como se tratam de tipos diferentes de empregado, cada um ganha de uma forma:

• Chefe: salário fixo e predefinido;

• PorComissao: valor fixo + comissão * vendas;

• PorItem: valor por produção * quantidade produzida;

• PorHora: valor por hora * total de horas trabalhadas.

• Declarando o método como abstrato na superclasse garante-se que nas 4 subclasses haverá a implementação do método ganha() para cada tipo de empregado (do contrário, objetos destas classes não poderão ser criados).

Empregado

PorItem PorComissao

Chefe PorHora

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

// Classe final Chefe, derivada de Empregado public final class Chefe extends Empregado {

private double salario;

public Chefe(String n, String f, double s) {

super(n,f);

setSalario(s);

}

public void setSalario( double s ) { salario = (s > 0 ? s : 0.0);

}

public double ganha() { return salario;

}

public String toString() {

return "Chefe: " + super.toString();

} }

Implementação do método abstrato da superclasse.

Chefe.java

(3)

© ELFS 175

7. Classes Abstratas e Interfaces

public final class PorComissao extends Empregado {

private double salario;

private double comissao; // comissao por item vendido private int vendas; // numero de itens vendidos

public PorComissao(String n, String f, double s, double c, int v) { super(n,f);

setSalario(s);

setComissao(c);

setVendas(v);

}

public void setSalario(double s) { salario = (s > 0 ? s : 0.0); } public void setComissao(double c) { comissao = (c > 0 ? c : 0.0); } public void setVendas(int v) { vendas = (v > 0 ? v : 0); }

public double ganha() {

return salario + comissao*vendas;

}

public String toString() {

return "Por comissao: " + super.toString();

} }

Implementação do método abstrato da superclasse.

PorComissao.java

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

public final class PorItem extends Empregado {

private double producao; // salario por producao private int quantidade; // quantidade produzida public PorItem(String n, String f, double p, int q) {

super(n,f);

setProducao(p);

setQuantidade(q);

}

public void setProducao(double p) { producao = (p > 0 ? p : 0.0); } public void setQuantidade(int q) { quantidade = (q > 0 ? q : 0); } public double ganha() {

return producao*quantidade;

}

public String toString() {

return "Por item: " + super.toString();

} }

Implementação do método abstrato da superclasse.

PorItem.java

(4)

© ELFS 177

7. Classes Abstratas e Interfaces

public final class PorHora extends Empregado {

private double valor; // salario por hora

private double horas; // horas trabalhadas (300 horas no máximo) public PorHora(String n, String f, double v, double h)

{

super(n,f);

setValor(v);

setHoras(h);

}

public void setValor(double v) { valor = (v > 0 ? v : 0.0); } public void setHoras(double h) {

horas = (h >= 0 && h <= 300 ? h : 0.0);

}

public double ganha() { return valor*horas;

}

public String toString() {

return "Por hora: " + super.toString();

} }

Implementação do método abstrato da superclasse.

PorHora.java

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

import java.text.DecimalFormat;

public class TestaClasseAbstrata {

public static void main( String args[] ) {

Empregado e; // variável de referência da superclasse String sai = "";

DecimalFormat df = new DecimalFormat("0.00");

Chefe c = new Chefe("Joao","Silva",3000.00);

PorComissao pc = new PorComissao("Maria","Souza",400.00,3.00,150);

PorItem pi = new PorItem("Pedro","Cabral",2.50,200);

PorHora ph = new PorHora("Marta","Ferreira",13.75,40.50);

e = c; // recupera as característcias de Chefe sai += e.toString() + " ganha $" + df.format(e.ganha()) + "\n";

e = pc; // recupera as característcias de PorComissao sai += e.toString() + " ganha $" + df.format(e.ganha()) + "\n";

e = pi; // recupera as característcias de PorItem sai += e.toString() + " ganha $" + df.format(e.ganha()) + "\n";

e = ph; // recupera as característcias de PorHora sai += e.toString() + " ganha $" + df.format(e.ganha()) + "\n";

System.out.println(sai);

} }

TestaClasseAbstrata.java

Chefe: Joao Silva ganha $3000,00 Por comissao: Maria Souza ganha $850,00

(5)

© ELFS 179

7. Classes Abstratas e Interfaces

Interfaces

• Classes abstratas contém métodos abstratos (pelo menos um) mas podem conter atributos e métodos concretos. Interfaces são classes abstratas que contêm apenas métodos abstratos. Portanto, em uma interface não existe implementação alguma.

• A definição de uma interface é feita pela palavra-chave interface.

• Para utilizar uma interface, uma classe deve especificar que implementa (implements) a interface e a classe deve definir cada método da interface respeitando o número de argumentos e o tipo de retorno especificado na interface. Se a classe deixar de implementar algum método da interface, a classe se torna abstrata.

• Diversas classes, sem nenhum relacionamento, podem se relacionar com uma mesma interface, assim como uma classe pode implementar mais de uma interface.

Automovel

Veiculo Companhia

Caminhao

Se Veiculoé uma interface e Companhiaé uma sub-interface de Veiculo, a classe Caminhao pode implementar as duas interfaces (note que isso não seria permitido se Veiculo e Companhia fossem classes, pois haveria herança múltipla). Note que Companhiae Automovel não têm relacionamento algum, mas se relacionam com a mesma interface (Veiculo).

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

• A principal utilização de interfaces está em declarar métodos que uma ou mais classes devem necessariamente implementar.

• Como a interface não apresenta o código dos métodos, ela pode ser utilizada para apresentar a interface pública de uma classe sem revelar sua

implementação.

• Como diferentes classes, sem nenhum relacionamento, podem implementar uma mesma interface pode-se capturar similaridades entre classes sem definir um relacionamento explícito entre elas.

• Através de interfaces se pode simular herança múltipla: uma mesma classe pode implementar diferentes interfaces.

• Outra utilização é na definição de objetos public static final (constantes).

Exemplo:

public interface Constantes { public static final int UM = 1;

public static final int DOIS = 2;

public static final int TRES = 3;

}

As classes que implementam a interface Constantespodem utilizar as constantes UM, DOIS e TRES em qualquer lugar na definição da classe.

Uma classe pode até utilizar essas constantes importandoa interface e então referenciando as constantes como: Constantes.UM, Constantes.DOIS e Constantes.TRES.

Note que, como não há métodos declarados nessa interface, uma classe que implementa essa interface não é obrigada a fornecer implementação alguma.

Constantes.java

(6)

© ELFS 181

7. Classes Abstratas e Interfaces

• Exemplo: Hierarquia de formas geométricas com interfaces. Desejamos que todas as classes que implementam formas geométricas disponham dos métodos getNome(), getArea() e getVolume().

public interface Forma {

public String getNome();

public double getArea();

public double getVolume();

}

Forma.java

public class UsaFormas {

public static void mostra(Forma f) {

System.out.println(f.getNome() + ": " + f.toString() +

"\nArea = " + f.getArea() + "\nVolume = " + f.getVolume());

}

public static void main(String args[]) {

Ponto p = new Ponto(7, 11); // x, y Circulo c = new Circulo(3.5, 22, 8); // r, x, y Cilindro d = new Cilindro(10, 3.3, 10, 10); // h, r, x, y mostra(p);

mostra(c);

mostra(d);

} }

Construir a hierarquia:

Forma Ponto Circulo Cilindro UsaFormas.java

7. Classes Abstratas e Interfaces 7. Classes Abstratas e Interfaces

Exercícios:

1. Modifique a classe abstrata Empregado incluindo o campo privado dataNascimento e um método público concreto adicionarBonus(), que acrescenta $100,00 ao salário de cada empregado que faz aniversário no mês. Criar uma classe FolhaPagamento, que lê dados referentes ao conjunto de empregados de uma empresa e mostra a folha de pagamento da

empresa.

2. Escrever as classes Ponto, Circulo e Cilindro que implementam a interface Forma. Executar a classe UsaFormas para verificar se as classes foram implementadas corretamente.

3. Criar uma interface MeuHorario com métodos getHora(), getMinuto(), getSegundo(), setHora(), setMinuto(), setSegundo(), toString(). Criar uma classe Horario que implementa essa interface. Criar uma classe UsaHorario que lê uma dada quantidade de segundos, cria e mostra um objeto da classe Horario referente ao dado lido. Por exemplo: 30035 segundos = 08:20:35.

4. Criar uma interface MinhaData com métodos getDia(), getMes(), getAno() e

mostrarData(). Criar uma classe Data que implementa essa interface. A

classe Data deve incluir também métodos set para tratamento dos dados

referentes aos campo privados da classe: dia, mes, ano. Suponha que um

Referências

Documentos relacionados

Na atividade de hoje você irá fazer um desenho bem bonito desejando Feliz Natal a todos seus amiguinhos, depois com a ajuda de um adulto fotografe esse momento e envie para sua

n~o ensacadas confirmam a importância das abelhas como agentes polinizadores para cultura, sendo o mesmo verificado por FREE &amp; WILLIAMS (1976) usando a mesma

A PRESIDENTE da Assembleia da República, Verónica Macamo, defende que as mulheres devem ser solidárias umas com as outras e evitarem a tendência de se

Monitoria em disciplinas vinculadas ao Curso de Fisioterapia, exercida por um período de, no mínimo, 1 (um) semestre letivo, com dedicação mínima de 10 (dez) horas semanais.

O trabalho foi realizado com base na prática pedagógica da autora, professora da Rede Municipal de Educação de Ijuí/RS, durante o estudo dos animais vertebrados e

Considerações Preliminares: O objeto do presente certame é a formação de “Registro de Preços para futura e eventual aquisição de dietas de sistema fechado(industrializada),

Entendendo a centralidade das lutas em favor dos camponeses que se recriam nas contradições da lógica do capital, seja na luta para se reproduzirem enquanto classe

Uma vez identificada as ações antrópicas negativas como desmatamento, expansão imobiliária, lançamento de efluentes líquidos domésticos e acúmulo de resíduos