Programação Orientada a Objectos
Transcrição
Programação Orientada a Objectos
Programação Orientada a Objectos Herança, Polimorfismo 1 Programação -UEM Maputo, 30 de Abril de 2014 Reutilização Cenário: Um banco oferece diversos serviços que podem ser contratados individualmente pelos clientes. Quando um serviço é contratado, o sistema do banco deve registrar quem foi o cliente que contratou o serviço, quem foi o funcionário responsável pelo atendimento ao cliente e a data de contratação. De modo a ser produtivo, a modelagem dos serviços do banco deve diminuir a repetição de código. A ideia é reaproveitar o máximo do código já criado. Numa abordagem podemos definir uma classe para todos serviços; class Servico { private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ; // métodos } Maputo, 30 de Abril de 2014 2 Reutilização • Empréstimo: O empréstimo é um dos serviços que o banco oferece. Quando um cliente contrata esse serviço, são definidos o valor e a taxa de juros mensal do empréstimo. Devemos acrescentar dois atributos na classe Servico: um para o valor e outro para a taxa de juros do serviço de empréstimo. class Servico { //GERAL private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ; // EMPRÉSTIMO private double valor ; private double taxa ; //Métodos} Maputo, 30 de Abril de 2014 3 • Seguro: Outro serviço oferecido pelo banco é o seguro de veículos. Para esse serviço devem ser definidas as seguintes informações: veículo assegurado, valor do seguro e a franquia. Devemos adicionar três atributos na classe Servico. • class Servico { // GERAL private Cliente contratante ; private Funcionario responsavel ; private String dataDeContratacao ; //EMPRÉSTIMO private double valor ; private double taxa ; // SEGURO DE VEICULO private Veiculo veiculo ; private double valorDoSeguro ; private double franquia ; // métodos } Maputo, 30 de Abril de 2014 4 Reutilização • Para evitar a repetição do código, podemos recorrer ao conceito de herança, donde definiremos uma classe genérica e várias específicas. Dessa forma Servico teríamos: Emprestimo Maputo, 30 de Abril de 2014 SeguroDeVeiculo 5 Herança • É uma técnica onde uma classe passa a utilizar atributos e métodos definidos numa outra classe tida como seu ancestral. A herança é o compartilhamento de atributos e métodos entre classes baseado num relacionamento hierárquico do tipo pai e filho, ou seja, a classe pai contêm definições que podem ser utilizadas nas classes definidas como filho. • A classe pai é denominada classe base (ou superclasse), sendo que as classes filhas denominam-se classes derivadas (ou subclasses). Esta representação sugere que uma classe poderia ser definida em termos mais genéricos e depois refinada sucessivamente numa ou mais subclasses específicas. Maputo, 30 de Abril de 2014 6 Herança • Conforme isto, pode-se dizer que uma classe derivada é uma especialização da superclasse correspondente. • Em Java, para indicar que uma classe é derivada, utiliza-se a palavra reservada extends sendo que a classe pai não recebe qualquer tipo de indicação. • public class Superclass{ //superclasse java .....} • public class Subclass extends Superclass{ //subclasse java .....} Maputo, 30 de Abril de 2014 7 Herança • Em princípio, todas as características e comportamentos definidos para uma certa superclasse são na totalidade aplicáveis para seus descendentes, tais que, não podem omitir ou suprimir tais características pois não seriam descendentes. Por outro lado, uma subclasse pode modificar a implementação de uma operação por questões de eficiência sem modificar a implementação da classe pai. • As subclasses podem adicionar novos métodos e atributos não existentes na superclasse, criando uma especialização da classe base Maputo, 30 de Abril de 2014 8 Herança • Em UML a especialização pode ser expressa da seguinte forma: Funcionario -string nome -int idade -double salario +tiraFerias() +aumentaSalario() +getBonus() Maputo, 30 de Abril de 2014 Gerente -int codigo +tiraFerias() +aumentaSalario(int taxa) +getBonus() 9 Polimorfismo • Previamente, afirmamos que herança oferece um mecanismo de especialização, o polimorfismo por sua vez oferece mecanismo de generalização que permite separar a interface de uma classe da sua efectiva implementação. • Portanto, polimorfismo é a capacidade de um objecto poder ser referenciado de várias formas, lembrando que um objecto é criado sob um tipo e continua sendo desse mesmo tipo até a sua destruição Maputo, 30 de Abril de 2014 10 Polimorfismo • Imagine-se que a cada final de ano atribui-se um bónus a cada funcionário dessa organização equivalente a 10%, sendo que o gerente recebe 5% a mais. Teríamos a classe Funcionario da seguinte forma • class Funcionario { private String nome; Private int idade; private double salario; public double getBonus() { return this.salario * 0.10; } // métodos } Maputo, 30 de Abril de 2014 11 Polimorfismo • Quando um método é herdado, este pode ser prontamente utilizado ou reescrito de acordo com as exigências dessa classe. Portanto, na classe Gerente o método getBonus() ficaria da seguinte forma • class Gerente extends Funcionario { private int codigo; public double getBonus() { return super.getBonus()+this.getSalario()*0.05; }} Maputo, 30 de Abril de 2014 12 Construtores • Quando se tem uma hierarquia de classes, pelo menos um construtor de cada classe de uma mesma sequência hierárquica deve ser chamado ao instanciar um objecto. Por exemplo, quando um objecto da classe Gerente é criado, pelo menos um construtor da própria classe Gerente e um da classe Funcionario devem ser executados. Além disso, os construtores das classes mais genéricas são chamados antes dos construtores das classes específicas. • class Funcionario { // ATRIBUTOS public Funcionario () { System . out . println (" Funcionario "); } } Maputo, 30 de Abril de 2014 13 Construtores • class Gerente extends Funcionario { // ATRIBUTOS public Gerente () { //super(atributos separados por vírgulas conforme os parâmetros do construtor) System . out . println (" Gerente "); } } • Por padrão, todo construtor chama o construtor sem argumentos da superclasse se não existir nenhuma chamada explícita do construtor. Maputo, 30 de Abril de 2014 14 Resumo • public class Funcionario { private String nome ; private double salario ; public Funcionario(String nome){ this.nome=nome; } // GETTERS AND SETTERS public double getBonus () { return this . salario * 0.1; } } Maputo, 30 de Abril de 2014 15 Resumo • class Gerente extends Funcionario { private String senha ; public Gerente(String nome){ super(nome); } // GETTERS AND SETTERS public double getBonus () { return super.getBonus() + this . getSalario () * 0.05; } } Maputo, 30 de Abril de 2014 16 Fim Maputo, 30 de Abril de 2014 17