Baixe o app para aproveitar ainda mais
Prévia do material em texto
Implementação Orientada a Objetos - IOO Marcia Bissaco Universidade de Mogi das Cruzes 1 1/2021 1 Em um diagrama de classes, podem ser observadas algumas associações entre as classes: Ver exemplo a seguir Associação entre classes 2 2 Modelagem de classes de um Sistema para clínica médica 3 Herança, Sobrescrita de métodos e polimorfismo 4 4 Herança (ou generalização), é a possibilidade de definir um objeto que é também (is-a) uma instância da classe mãe A classe filha herda todas as características (métodos e atributos que não são privados) da classe mãe, também podendo definir os seus próprios. A classe mãe é chamada de superclasse ou classe primitiva. A classe filha é chamada de subclasse ou classe derivada. Herança Exemplo Herança Exemplo Herança e polimorfismo Herança A classe Funcionario herda de Pessoa e também implementa características próprias. As classes Vendedor, Consultor e Gerente herdam as características de Funcionario e de Pessoa, mas também implementam características próprias. Existe uma implementação diferente do método calcularSalario para cada uma das classes derivadas. A classe Vendedor possui 6 atributos e 3 métodos. Herança, sobrescrita de métodos e polimorfismo Herança A classe Funcionario herda de Pessoa e também implementa características próprias. As classes Vendedor, Consultor e Gerente herdam as características de Funcionario e de Pessoa, mas também implementam características próprias. Existe uma implementação diferente do método calcularSalario para cada uma das classes derivadas. A classe Vendedor possui 6 atributos e 3 métodos. Por que usar herança? A herança ajuda a remover redundância de dados e comportamentos de classes que têm características em comum. Também ajuda a deixar o código mais limpo e organizado, e facilita o reuso. Sem herança, as classes do exemplo anterior ficariam assim: Herança A classe derivada deve fazer referência à superclasse usando a palavra reservada extends. Se a superclasse quiser permitir que as classes derivadas acessem seus atributos, estes devem ter o modificador de acesso protected, ao invés de private. Se a classe derivada possuir um método com a mesma assinatura da superclasse, este método sobrescreve o método original, ou seja, será chamado em seu lugar (sobrescrita de métodos). Herança (implementação) Exemplo Herança (implementação) public class Pessoa{ protected String nome; protected int rg; public Pessoa () {} public Pessoa (String n, int r) { nome = n; rg = r;} public void setNome(String nome){ this.nome = nome;} public void setRg(String Rg){ this.rg = rg;} public String getNome() { return nome;} public int getRg () {return rg;} public boolean cadastrar() {return true;} //deixa assim por enquanto }} public class Funcionario extends Pessoa { protected double salario; protected int registro; public Funcionario () { super();} public Funcionario (String n, int r, int rf) { super (n, r); registro = rf;} public void setRegistro(int registro) { this.registro = registro;} public int getRegistro() {return registro;} public double getSalario() {return salario;} public double calcularSalario() { return 678; //um valor inicial } public boolean cadastrar() { return true;// deixa assim por enquanto} public boolean demitir() { return true; // deixa assim por enquanto} } Herança (implementação) public class Vendedor extends Funcionario { private double comissao; private int numeroVendas; public Vendedor () { super(); } public Vendedor (String n, int r, int rf, double c, int nv) { super (n,r, rf); comissao = c; numeroVendas = nv;} // falta codificar os métodos de acesso public void setComissao(double comissão){ this.comissão comissão;} public double getComissao(){ return comissao;} public void setNumeroVendas(int numeroVendas){ this.numeroVendas = numeroVendas;} public int getNumeroVendas(){ return numeroVendas;} public double calcularSalario() { return numeroVendas * comissao;} } Herança (implementação) public class Consultor extends Funcionario { private double valorHora; private int horasTrabalhadas; public Consultor () { super(); } public Consultor (String n, int r, int rf, double vH, int hT) { super (n,r, rf); valorHora = vH; horasTrabalhadas = hT;} //falta codificar os métodos de acesso public double calcularSalario() { return horasTrabalhadas * valorHora;} } // fim da classe consultor public class Gerente extends Funcionario { private double bonificacao; //falta codificar os métodos construtores e métodos de acesso public double calcularSalario() { return super.calcularSalario() * 15 + bonificacao; } } 13 Os objetos das classes Vendedor, Consultor e Gerente também são objetos da classe Funcionario. É possível tratar um objeto Vendedor tanto pelo tipo Vendedor quanto pelo tipo Funcionario, o que chamamos de polimorfismo. Polimorfismo é a capacidade de um objeto identificado por uma classe poder assumir o comportamento definido por outra classe, através da redefinição (sobrescrita) de métodos. Funcionario obj; // declara obj do tipo Funcionario obj = new Vendedor(); // instancia um novo Vendedor em obj obj.setNome(“Maria”); // chama o setNome da classe Funcionario obj.calcularSalario(); // chama calcularSalario da classe Vendedor Herança e Polimorfismo 15 Herança e Polimorfismo (Implementação) public class TestaHeranca{ public static void main (String [] args){ Funcionario obj; // declara obj do tipo Funcionario obj = new Vendedor(); // instancia um novo Vendedor em obj obj.setNome(“Maria”); // chama o setNome da classe Funcionario obj.calcularSalario(); // chama calcularSalario da classe Vendedor System.out.println( “nome: ” + obj.getNome()); System.out.println( “nome: ” + obj.getSalario()); Vendedor obj2= new Vendedor(); } } 15 Desafio: implementar este diagrama. 16 Herança (Implementação) As classes Medico e Paciente herdam de Pessoa e também implementam características próprias. Neste diagrama não representa o polimorfismo. Contudo, poderia ser usado o polimorfismo aqui? 16
Compartilhar