MÉTODOS E CLASSES ABSTRATAS + INTERFACES
Retrato do Dr. Gachet de Van Gogh
Revendo Revendo Revendo
Revendo 3 3 3 3 conceitosconceitosconceitos de POOconceitosde POOde POOde POO…………
As três graças
Revisando três conceitos de POO:
Classe
Herança Sobreposição
Nome Campos Métodos
O QUE É UMA CLASSE ?
O Pensador, A. Rodin
Uma classe de deve abarcar características e funcionalidades comuns a
todos os casos particulares (instâncias)!
Classes Classes Classes
Classes –––– Campos e Campos e Campos e Campos e MMMMéééétodostodostodostodos
Extraindo propriedades e funcionalidades comuns a todas as lâmpadas !
Propriedades
•ligada/desligada (estado)
Funcionalidades
•ligar
•desligar
É uma idéia geral de lâmpada ! Classes
Classes Classes
Classes –––– Campos e Campos e Campos e Campos e MMMMéééétodostodostodostodos
Obra de P. Mondrian
Como construir classes ? public classLampada
{ // Definição das propriedades: campos.
private intestado;
// Definição das funcionalidades: métodos.
publicLampada() {setLampada(0);}
publicvoid setLampada(inta) {setEstado(a);}
public voidsetEstado(intb) {estado = (b > 0)?1:0;}
public intgetEstado( ) {returnestado;}
public StringgetLampada()
{return“Estado atual = ”+ estado;}
public voidmostrarLampada() {System.out.println(“Estado atual = ” + getEstado());} } // Fim classe.
Como diria P. Mondrian:
cada um no seu quadrado ! Classes
Classes Classes
Classes –––– Campos e Campos e Campos e Campos e MMMMéééétodostodostodostodos
Como usar objetos ?
Obra de J. Beever Os objetos são casos particulares da classe e portanto são criados
a partir da mesma através da palavra reservada new. É
interessante criar objetos em uma classe
diferente da onde foi definida a classe.
public classTestaLampada
{ // Definição de método principal a partir // do qual o programa será executado.
public static void main(Stringargs[]) { // Criando um objeto da classe Lampada
Lampada l1 = newLampada();
// Manipulando o objeto por meio dos // métodos descritos na classe.
l1.mostrarLampada();
l1.setLampada(1);
System.out.println(“l1 = ”+ getLampada());
l1.setEstado(-1);
System.out.printf(“Estado atual de l1 = %d
\n”, l1.getEstado());
}
} // Fim classe.
Exercício 1: O que faz o trecho de código acima ? Exercício 2: Modificar o programa anterior de modo O campo estado da Classe Lampada seja do tipo boolean e não mais do tipo int.
Usando Usando Usando
Usando objetosobjetosobjetosobjetos
HERANÇA
Não, você não vai aprender a ganhar rios de dinheiro…
Segundo Segundo Segundo
Segundo ConceitoConceitoConceitoConceito de POOde POOde POOde POO…………
O QUE É UMA HERANÇA ?
O Pensador, A. Rodin A Herança é quando algo é legado a alguém ! No caso de POO implica que uma classe herda campos
e métodos de outra classe já existente !
Ou seja, herança é o relacionamento entre uma classe mais geral (superclasse) e uma classe mais específica (subclasse). A herança
é uma relação do tipo:
“é um”! Pensando
Pensando Pensando
Pensando um um um poucoum poucopouco…pouco………
Veiculo
Carro Caminhao
+ Geral
Carro “é um” Veiculo e também Caminhao “é um” Veiculo ! - Hierarquia
Hierarquia Hierarquia
Hierarquia de classesde classesde classesde classes
Veiculo
Caminhao
+ Geral
Carro “é um” Veiculo e também Caminhao “é um” Veiculo ! -
# double posicao
# double velocidade - void acelerar(double a) - void reduzir(double a) - void atualizarPosicao()
Carro
# double numPassageiros - void acelerar(double a) - void reduzir(double a) - void atualizarPosicao() Hierarquia
Hierarquia Hierarquia
Hierarquia de classesde classesde classesde classes
Veiculo + Geral
Carro “é um” Veiculo e também Caminhao “é um” Veiculo ! -
# double posicao
# double velocidade - void acelerar(double a) - void reduzir(double a) - void atualizarPosicao()
Carro
# double numPassageiros - void acelerar(double a) - void reduzir(double a) - void atualizarPosicao() Terceiro
Terceiro Terceiro
Terceiro ConceitoConceitoConceitoConceito……… Sobreposi…SobreposiSobreposiççççãoSobreposi ãoãoão
Redefinição do método !
Hierarquia com Métodos e Classes Abstratas Empregado - String nome - String getNome() - String toString()
- abstract double ganha()
PorSalario -double salario -void setSalario() -String toString()
-abstract double ganha()
PorComissao -double vendas -double taxa
-void setVendas(double v) -void setTaxa(double t) -String toString()
-abstract double ganha()
PorSalarioeComissao -double salario
-double vendas -double taxa
-void setSalario(double s) -void setVendas(double v) -void setTaxa(double t) -String toString()
-abstract double ganha()
public abstract class Empregado {
private String nome;
public Empregado() {this(“SemNome”);}
public Empregado(String n) {nome = n;}
public String getNome() {return nome;}
public String toString() {return “Nome: ”+ nome + “\n”;}
publicabstractdouble ganha();
}
Transformando em código Java...
Método abstrato, ou seja, sem implementação definida, que torna a classe, também, abstrata. Duas propriedades importantes:
(1) Não é possível instanciar objetos de uma classe abstrata.
(2) A subclasse, para ser concreta, deverá fornecer uma
implementação para este método.
Empregado.java
// Classe final Chefe, derivada de Empregado public class PorSalario extends Empregado {
private double salario;
public PorSalario(String n, double s) {
super(n);
setSalario(s);
}
public void setSalario( double s ) { salario = (s > 0 ? s : 0.0);
}
public double ganha() { return salario;
}
public String toString() {
return super.toString + “Salario: " + salario;
} }
Implementação do método abstrato da superclasse.
PorSalario.java
Transformando em código Java...
public class PorComissao extends Empregado {
private double vendas; // volume total de vendas
private double taxa; // percentual de ganho a partir das vendas public PorComissao(String n, double v, double t)
{
super(n);
setVendas(v);
setTaxa(t);
}
public void setVendas(double v) { vendas = (v > 0 ? v : 0.0); } public void setTaxa(double t) { taxa = (t > 0 ? t : 0.0); } public double ganha() {
return taxa*vendas;
}
public String toString() {
return "Por comissao: " + super.toString();
} }
Implementação do método abstrato da superclasse.
PorComissao.java
Transformando em código Java...
public class PorSalarioeComissao extends Empregado {
private double salario; // salario fixo mensal private double vendas; // montante de vendas private double taxa; // percentual das vendas public PorItem(String n, double s, double v, int t) {
super(n);
setSalario(s);
setVendas(p);
setTaxa(t);
}
public void setSalario(double s) { salario = (s > 0 ? s : 0.0); } public void setVendas(double v) { vendas = (v > 0 ? v : 0); } public void setTaxa(double t) {taxa = (t > 0) ? t : 0;}
public double ganha() { return salario + taxa*vendas;
}
public String toString() {
return "Por item: " + super.toString();
} }
Implementação do método abstrato da superclasse.
PorSalarioeComissao.java
Transformando em código Java...
Uma outra hierarquia de classes empregando Interface Empregado
- String nome - String getNome() - String toString()
- abstract double ganha()
PorSalario -double salario -void setSalario() -String toString()
-abstract double ganha()
PorComissao -double vendas
-void setVendas(double v) -String toString()
-abstract double ganha()
PorSalarioeComissao -double salario
-double vendas
-void setSalario(double s) -void setVendas(double v) -String toString()
-abstract double ganha()
<<Comissao>>
- double TAXA = 0.10
- void somarVendas(double v)
public interfaceclass Comissao {
double TAXA = 0.10;
void somarVendas(double v) }
Transformando em código Java...
Interface é uma classe que só possui métodos abstratos. Ou seja, se uma classe é definida como interface, então todos os seus métodos são automaticamente abstratos. Diferentes classes quenão estão relacionadas pela herançapodem:
(1) Implementar o método dado pela interface e que é comum as classes.
(2) Empregar as constantes definidas em uma interface.
(3) Para usar um método de uma interface (1) ou suas constantes (2), uma classe deve usar a palavra-chave implements.
(4) Uma classe só pode herdar campos e métodos de uma única classe, mas pode implementar métodos e empregar constantes de diferentes interfaces.
Desse modo através de interfaces é possível simular herança múltipla.
Comissao.java
public class PorComissao extends Empregado implements Comissao {
private double vendas = 0.0; // volume total de vendas public PorComissao(String n, double v)
{
super(n);
setVendas(v);
}
public void setVendas(double v) { vendas = (v > 0 ? v : 0.0); } public double ganha() {
return TAXA*vendas;
}
public void somarVendas(double v){
vendas = vendas + v;
}
public String toString() {
return "Por comissao: " + super.toString();
} }
Implementação do método abstrato da superclasse.
Usa TAXA da interface.
PorComissao.java
Transformando em código Java...
Implementação do método da interface.
public class PorSalarioeComissao extends Empregado implements Comissao {
private double salario; // salario fixo mensal private double vendas; // montante de vendas
public PorSalarioeComissao(String n, double s, double v, int t) {
super(n);
setSalario(s);
setVendas(p);
}
public void setSalario(double s) { salario = (s > 0 ? s : 0.0); } public void setVendas(double v) { vendas = (v > 0 ? v : 0); } public double ganha() {
return salario + TAXA*vendas;
}
public void somarVendas(double v){
vendas = vendas + v;
}
public String toString() {
return "Por item: " + super.toString();
} }
PorSalarioeComissao.java
Transformando em código Java...
Implementação do método abstrato da superclasse.
Usa TAXA da interface.
Implementação do método da interface.
public class FolhadePagamento // Classe que testa as demais classes.
{
public static void main(String args[])
{ // Criando um vetor de objetos da classe Empregado!
Empregado ve[];
// Demais variáveis auxiliares.
PorComissao p1;
int k, n = 1;
Scanner input = new Scanner(System.in);
System.out.println(“Insira n:”);
n = input.nextInt();
ve = new Empregado[n];
// Preenchendo o vetor de empregados de acordo com a remuneração.
for (int i=0; i < v.length; i++) {
System.out.println(“Digite 1-Salario, 2-Comissao”);
k = input.nextInt();
if (k == 1)
ve[i] = new PorSalario(“S”+i,3000.0);
else {
p1 = new PorComissao(“C”+i,2300.0);
p1.somarVendas(7000.0);
ve[i] = pe }
// Mostrando os objetos contidos no vetor com toString e polimorfismo.
System.out.println(ve[i]);
} }
}
Criando uma Folha de Pagamento