Programação Orientada a Objetos Classes Abstratas. Sérgio Soares

Documentos relacionados
Classes Abstratas e Interfaces AULA 12

Herança (parte 2) Redefinição de métodos AULA 11

Introdução à Programação. Encapsulamento e Herança

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Classe Abstrata e Interface

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Herança e passagem de parâmetro AULA 09

Introdução à Programação. Conceitos Básicos de Orientação a Objetos

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Polimorfismo e Ligação Dinâmica. Alcides Pamplona Polimorfismo e Ligação Dinâmica

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

JAVA. Professor: Bruno Toledo

Introdução. Atributos em Java. Atributos. Acesso à atributos em Java. Atributo versus variável. Atributos, métodos e encapsulamento.

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Herança. Herança. Herança. Herança. Herança. Programação Orientada a Objetos

4 Conceito de Herança

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Linguagem de Programação III

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Modificadores de Acesso e Atributos de Classe

Interfaces POO. Prof. Marcio Delamaro

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Programação Orientada a Objetos

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Laboratório de programação II

Estrutura de Dados Funções e Procedimentos

Linguagem de Programação. Diagrama de classes

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Orientação a Objetos - Herança

Sabemos que a classe é responsável por definir a estrutura e o comportamento de seus objetos. Portanto, os objetos são instâncias das classes.

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

9 Classes Abstractas e Interfaces

Herança e Propriedades

Interfaces e Classes Abstratas

Linguagem de Programação II Implementação

JAVA TÓPICOS ESPECIAIS DE PROGRAMACAO ORIENTADA A OBJETOS

Relacionamentos entre objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Herança e Polimorfismo

Boas práticas com Orientação a Objetos. Paulo Silveira

Programação Orientada a Objetos

Programação Orientada a Objetos

Java para Desktop. Programação Orientada à Objetos 2 JSE

Classes e Objetos. Sintaxe de classe em Java

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Palavras Reservadas da Linguagem Java

Tema da aula Introdução ao paradigma de programação: Orientado a Objetos

Herança; Sobrescrita, Sobrecarga e Polimorfismo; Classes abstratas e concretas (finais).

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Aula 10 POO 1 Classes Abstratas. Profa. Elaine Faria UFU

Programação por Objectos. Java

Linguagem de Programação II Implementação

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

[Desenvolvimento OO com Java] Modificadores de acesso e atributos de classe

Programação Orientada a Objetos Flávio de Oliveira Silva 144

Orientação a Objetos Básica

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Sobreposição de Métodos

Programação Java (nível intermediário) 4. Polimorfismo

Programação Orientada a Objetos II

Computação II Orientação a Objetos

Herança. Prof. Andrea Garcia PROW II

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

Recursão. Em Java... Exemplo: Série de Fibonacci. Iteração e recursão. Exercícios. Especialização em Engenharia de Software - CEUT

Introdução. Programação. Orientada a Objetos: Reuso. Introdução. Classes Abstratas

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Linguagem de programação Programação Orientada a objetos

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

Aula 7 POO 1 Herança. Profa. Elaine Faria UFU

extendsé usado para indicar herança em JAVA

Transcrição:

Programação Orientada a Objetos Classes Abstratas Sérgio Soares scbs@cin.ufpe.br

Até aqui Quando usar herança? Ao redefinir um método manter o comportamento herdado! 2

Adivinhem... Surge um novo requisito na aplicação bancária Temos de cobrar um imposto em certos tipos de contas Lembram da CPMF? 3

Objeto Conta Imposto creditar saldo numero 875,32 21.342-7 debitar 4

Estados do Objeto Conta Imposto debitar(20) creditar Crédito creditar Crédito saldo numero getsaldo Número 875,00 21.342-7 875,32 21.342-7 saldo numero getsaldo Número 854,98 21.342-7 875,32 21.342-7 debitar Débito debitar Débito 5

Conta Imposto: Assinatura Sem herança public class ContaImposto { public ContaImposto (String numero) { public void creditar(double valor) { public void debitar(double valor) { public String getnumero() { public double getsaldo() { 6

Conta Imposto: Assinatura Com herança public class ContaImpostoM extends Conta { public ContaImpostoM(String numero) { public void debitar(double valor) { 7

Conta Imposto: Descrição Com herança public class ContaImpostoM extends Conta { private static final double CPMF = 0.0038; public ContaImpostoM (String numero) { super (numero); public void debitar(double valor) { double imposto = (valor * CPMF); super.debitar(valor + imposto); 8

Subtipos e Subclasses ContaImposto Conta 9

Subclasses e Comportamento (1) Objetos da subclasse devem se comportar como os objetos da superclasse Afinal de contas queremos usar objetos da subclasse onde os objetos da superclasse são utilizados public class Banco { private Conta[] contas; private int indice; //... 10

Subclasses e Comportamento (2) Redefinições de métodos devem preservar o comportamento (semântica) do método original No que diz respeito ao comportamento (e atributos) herdado Grande impacto sobre manutenção/ evolução de software... 11

Revisão/Otimização de Código... double m(conta c) { c.creditar(10); c.debitar(10); return c.getsaldo();...... double m(conta c) { return c.getsaldo();... Considerando apenas o retorno do método m, as duas opcões são sempre equivalentes? Em que contextos? 12

Subclasses e Evolução de Software Deveria ser possível raciocinar sobre o código usando-se apenas a definição dos tipos das variáveis envolvidas (Conta) O comportamento do código deveria ser independente do tipo do objeto (Conta, ContaEspecial, ContaImposto) associado a uma dada variável em tempo de execução 13

Reuso sem Subtipos Conta Poupanca ContaImpostoM ContaEspecial ContaImpostoM muda a semântica do método debitar e se herdar de Conta quebra a noção de subtipos!!! 14

Qual a alternativa então? O que existe de comum entre Conta e ContaImposto? Vamos criar uma nova classe que contenha essa parte em comum Conta e ContaImposto devem herdar dessa nova classe Atenção: debitar é diferente nas duas classes Mas ambas as contas devem permitir debitar um valor... 15

Reuso preservando Subtipos ContaAbstrata Conta ContaImposto Poupanca ContaEspecial 16

Definindo Classes Abstratas public abstract class ContaAbstrata { private String numero; private double saldo; public ContaAbstrata (String numero) { this.numero = numero; this.saldo = 0.0; public void creditar(double valor) { this.saldo = this.saldo + valor; public double getsaldo() { return this.saldo; 17

Definindo Classes Abstratas public String getnumero() { return this.numero; protected void setsaldo(double saldo) { this.saldo = saldo; public abstract void debitar(double valor); O método abstrato não tem implementação, mas 1. Permite programar (não executar) chamando o método da classe abstrata (na classe Banco, por exemplo) 2. Obriga que as subclasses concretas implementem o método 18

Revisão/Otimização de Código... double m(contaa c) { c.creditar(10); c.debitar(10); return c.getsaldo();...... double m(contaa c) { return c.getsaldo();... E agora, a modificação é correta? Em que contextos? 19

Classes Abstratas Possibilita herança de código preservando comportamento (semântica) Não do método debitar, claro Métodos abstratos: geralmente existe pelo menos um são implementados nas subclasses Não cria-se objetos: mas devem ter construtores, para reuso se necessário, métodos protected para serem acessados nas subclasses 20

Contas: Descrição Modificada public class Conta extends ContaAbstrata { public Conta(String numero) { super (numero); public void debitar(double valor) { this.setsaldo(this.getsaldo() - valor); Implementação do método abstrato observe o uso do método protected 21

Poupanças: Descrição Original public class Poupanca extends Conta { public Poupanca(String numero) { super (numero); public void renderjuros(double taxa) { this.creditar(this.getsaldo() * taxa); Nada mudou para Poupanca 22

Conta Especial: Descrição Original public class ContaEspecial extends Conta { public static final double TAXA = 0.01; private double bonus; public ContaEspecial (String numero) { super(numero); public void creditar(double valor) { this.bonus = this.bonus + (valor * TAXA); super.creditar(valor); Nada mudou para ContaEspecial 23

Conta Imposto: Descrição public class ContaImposto extends ContaAbstrata { public static final double CPMF = 0.0038; public ContaImposto (String numero) { super(numero); public void debitar(double valor) { double imposto = valor * CPMF; double total = valor + imposto; super.setsaldo(this.getsaldo() total); Implementação do método abstrato observe o uso do método protected 24

Substituição e Ligações Dinâmicas ContaAbstrata ca1, ca2; ca1 = new ContaEspecial( 21.342-7 ); ca2 = new ContaImposto( 21.987-8 ); ca1.debitar(500); ca2.debitar(500); System.out.println(ca1.getSaldo()); System.out.println(ca2.getSaldo()); Exemplo de um pedaço de um método main 25

Classes Abstratas: Utilização Herdar código sem quebrar noção de subtipos, preservando o comportamento do supertipo Generalizar código, através da abstração de detalhes não relevantes Projetar sistemas, definindo as suas arquiteturas e servindo de base para a implementação progressiva dos mesmos 26

Contas: Projeto OO public abstract class ContaProjeto { private String numero; private double saldo; //... public abstract void creditar(double valor); public abstract void debitar(double valor); public String getnumero() { return numero; protected setsaldo(double saldo) { this.saldo = saldo; //... 27

Pessoa: Reuso e Subtipos Pessoa PessoaJuridica PessoaFisica 28

Pessoa: Projeto OO public abstract class Pessoa { private String nome;... public abstract String getcodigo(); 29

Pessoa Física: Projeto OO public class PessoaFisica extends Pessoa { private String cpf;... public String getcodigo() { return cpf; 30

Pessoa Jurídica: Projeto OO public class PessoaJuridica extends Pessoa { private String cnpj;... public String getcodigo() { return cnpj; 31

public class RepositorioPessoasArray { private Pessoa[] pessoas;... public Pessoa procurar(string codigo) { Pessoa p = null; boolean achou = false; for (int i=0; i<indice &&!achou; i++) { p = pessoas[i]; if (p.getcodigo().equals(codigo)) achou = true; else p = null; return p; 32