Upload
eliabe-thomaz
View
226
Download
0
Embed Size (px)
DESCRIPTION
Fala sobre herança de classes
Citation preview
11. Herana Herana - forma de reutilizao de software Novas classes so criadas a partir de classes j
existentes Absorvem atributos e comportamentos, e incluem
os seus prprios Sobrescrevem mtodos - redefinem mtodos herdados
Subclasse herda de uma superclasse Superclasse direta - subclasse herda explicitamente Superclasse indireta - subclasse herda de dois ou mais
nveis acima na hierarquia de classes
Exemplo de herana Um retngulo um quadriltero
Retngulo um tipo especfico de quadriltero Quadriltero a superclasse, retngulo a subclasse No se pode dizer que um quadriltero um
retngulo Nomes podem ser confusos porque a subclasse
tem mais caractersticas que a superclasse Subclasse mais especfica que a superclasse Toda subclasse um objeto da sua superclasse, mas
no vice-versa
Formam estruturas hierrquicas (rvores) Ex: criar uma hierarquia para a classe Forma
2Utiliza-se a palavra-chave extends:class FormaBidimensional extends Forma{...
} Obs: membros private da superclasse no estoacessveis diretamente na subclasse! Ento, como acess-los ???
Forma
FormaBidimensional FormaTridimensional
Circulo Quadrado Triangulo Esfera Cubo Piramide
Em uma superclasse: public
Acessvel em qualquer classe private
Accesvel somente nos mtodos da prpria superclasse
protected Proteo intermediria entre private and public Somente acessvel pelos mtodos da superclasse ou de uma
subclasse desta
Mtodos na subclasse Podem se referir a membros public ou protected
pelo nome
3 Sobrescrevendo mtodos Subclasse pode redefinir mtodos da superclasse
Quando um mtodo referenciado em umasubclasse, a verso escrita para a subclasse utilizada
possvel acessar o mtodo original da superclasse:super.nomeDoMetodo(...)
Para invocar o construtor da superclasseexplicitamente:super(); // pode-se passarparmetros se necessrio
Se for chamado dessa forma, tem que ser oprimeiro comando no construtor da subclasse!
Exemplo prtico: os professores de uma universidadedividem-se em 2 categorias professores de regime integral professores horistas
Professores de regime possuem um salrio fixo para 40horas de atividade semanais
Professores horistas recebem um valor estipulado por hora.
O cadastro de professores desta universidade armazena onome, idade, matrcula e informao de salrio
Pode ser resolvido atravs de uma modelagem de classescomo segue:
4 As classes tm alguns atributos e mtodos iguais. O que acontece se precisarmos alterar a representao de algum atributo, como
por exemplo, o nmero de matrcula para inteiros ao invs de uma string ? Ser necessrio alterar os construtores e os mtodos retornaMatricula() nas duas
classes, o que ruim para a programao Motivo: cdigo redundante Como resolver ? Herana!
Classe ProfRegime: String nome, matricula int idade float salario
ProfRegime(String, String, int, float) String retornaNome() String retornaMatricula() int retornaIdade() float retornaSalario()
Classe ProfHorista: String nome, matricula int idade, int total_horas float salario_hora
ProfHorista(String, String, int, int, float) String retornaNome() String retornaMatricula() int retornaIdade() float retornaSalario() int retornaHoras()
Herana a capacidade de reutilizar cdigo pela especializao desolues genricas j existentes
Neste caso, cria-se uma classe Professor, que contm os atributos emtodos comuns aos dois tipos de professor:
Classe Professor: String nome, matricula int idade
Professor(String, String, int) String retornaNome() String retornaMatricula() int retornaIdade() float retornaSalario()
A partir dela, cria-se duas novas classes, que representaro os professoreshoristas e de regime.
Para isso, essas classes devero herdar os atributos e mtodosdeclarados pela classe pai, Professor.
5Classe Professor: String nome, matricula int idade
Professor(String, String, int) String retornaNome() String retornaMatricula() int retornaIdade() float retornaSalario()
Classe ProfRegime:float salario
ProfRegime(String, String, int, float) float retornaSalario()
Classe ProfHorista: int total_horas float salario_hora
ProfHorista(String, String, int, int, float float retornaSalario() int retornaHoras()
class Professor{
protected String nome;protected String matricula;protected int idade;
public Professor(String n,String m,int i){
nome = n;matricula = m;idade = i;
}
public String retornaNome(){ return nome; }public String retornaMatricula(){ return matricula; }public int retornaIdade(){ return idade; }public float retornaSalario(){ return 0; }
}
6class ProfRegime extends Professor{
protected float salario;
public ProfRegime(String n,String m,int i,float vs){super(n,m,i);if (vs > 0) salario = vs;
}
public float retornaSalario(){return salario - (salario * 0.16);}
}
class ProfRegime extends Professor{
protected float salario;
public ProfRegime(String n,String m,int i,float vs){super(n,m,i);if (vs > 0) salario = vs;
}
public float retornaSalario(){return salario - (salario * 0.16);}
}
Lembrando que extends significa que a classe ProfRegime deveherdar os mtodos e atributos da classe Professor
7class ProfRegime extends Professor{
protected float salario;
public ProfRegime(String n,String m,int i,float vs){super(n,m,i);if (vs > 0) salario = vs;
}
public float retornaSalario(){return salario - (salario * 0.16);}
}
A construo super(...) a chamada para o mtodo construtorda classe pai, a superclasse de ProfRegime
class Professor{
...
public Professor(String n,String m,int i){
nome = n;matricula = m;idade = i;
}
class ProfRegime extends Professor{
protected float salario;
public ProfRegime(String n,String m,int i,float vs){super(n,m,i);if (vs > 0) salario = vs;
}...
}
8class Professor{
...
public Professor(String n,String m,int i){
nome = n;matricula = m;idade = i;
}
class ProfRegime extends Professor{
protected float salario;
public ProfRegime(String n,String m,int i,float vs){super(n,m,i);if (vs > 0) salario = vs;
}...
}
executado antes
executado depois
class ProfHorista extends Professor{
protected float salario_hora;protected int total_horas;
public ProfHorista(String n,String m,int i,int h, float vs){super(n,m,i);if (h > 0) total_horas = h;if (vs > 0) salario_hora = vs;
}
public float retornaSalario(){float salario_base = salario_hora * total_horas;return salario_base - (salario_base * 0.16);}
}
9 Outro exemplo: pontos, crculos, cilindros Classe Ponto
variveis protected x, y mtodos: setPonto, getX, getY, sobrescrevetoString
Classe Circulo (extends Ponto) varivel protected raio mtodos: setRaio, getRaio, area, sobrescrevetoString
Classe Cilindro (extends Circulo) varivel protected altura mtodos: setAltura, getAltura, area (superfcie),volume, sobrescreve toString
Classe Pontoclass Ponto{
protected float x,y;
public Ponto(){x = y = 0;
}
public Ponto(float x,float y){setPonto(x,y);
}
public void setPonto(float x,float y){this.x = x;this.y = y;
}
A palavra-chave this serve para referenciar o prprio objeto
10
Classe Ponto (cont.)
public float getX() { return x; }
public float getY() { return y; }
// O mtodo toString() retorna uma// representao textual de um// objetopublic String toString(){return "[" + x + ", " + y + "]";
}}
O mtodo toString() est sendo sobrescrito,pois existe na superclasse (Object)
Classe Circuloclass Circulo extends Ponto{
protected float raio;
public Circulo(){// construtor de Ponto chamado implicitamente!setRaio(0);
}
public Circulo(float x,float y,float raio){super(x,y); // construtor de Ponto chamado explicitamente!setRaio(raio);
}
public void setRaio(float raio){if(raio
11
Classe Circulo (cont.)
public float getRaio() { return raio; }
public float area(){return Math.PI * raio * raio;
}
// O mtodo toString() retorna uma// representao textual de um// objetopublic String toString(){return Centro= + super.toString()+
Raio= + raio;}
}
Observe o uso de super.toString() parachamar o mtodo da superclasse Ponto
Classe Cilindroclass Cilindro extends Circulo{
protected float altura;
public Cilindro(){// construtor de Circulo chamado implicitamente!setAltura(0);
}
public Cilindro(float x,float y,float raio,float alt){// construtor de Circulo chamado explicitamente!super(x,y,raio);setAltura(alt);
}
public void setAltura(float altura){if(altura
12
Classe Cilindro (cont.)
public float getAltura() { return altura; }
public float area(){return 2 * super.area() + Math.PI * raio * altura;
}
public float volume(){return super.area() * altura;
}
public String toString(){return super.toString()+ Altura= + altura;
}}
Observe o uso de super.toString() parachamar o mtodo da superclasse Circulo
Exerccio:
Escreva o cdigo para implementar a seguinte hierarquia de classes:
Atributos da classe Animal :String nome
Mtodos da classe Animal:void imp() // imprime o nome e a classe do animalString getNome()void talk() // Me not falar
Mtodos da classe Passaro:void talk() // piu, piu.
Mtodos da classe BemTeVi:void talk() // bem-te-vi!
Atributos da classe Papagaio:String vocabulario // frase
Mtodos da classe Papagaio:void talk() // exibe vocabulariovoid setVoc(String v) //altera voc.
A classe mamfero no tem atributos ou mtodos.
Atributos da classe Cachorro:boolean lateMuito
Mtodos da classe Cachorro:void setLateAlto()void setLateBaixo()void talk() // AU! AU! ou au, au...
Mtodos da classe Vaca;void talk() // Muuu...