heranca de classes

Upload: eliabe-thomaz

Post on 01-Mar-2016

226 views

Category:

Documents


0 download

DESCRIPTION

Fala sobre herança de classes

TRANSCRIPT

  • 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...