46
Herança

Herança

  • Upload
    read

  • View
    21

  • Download
    0

Embed Size (px)

DESCRIPTION

Herança. Herança. O que é herança ? - PowerPoint PPT Presentation

Citation preview

Page 1: Herança

Herança

Page 2: Herança

Herança

O que é herança?

Herdar é derivar características de gerações precedentes. No mundo da Programação Orientada a Objetos, o termo é associado com uma das formas de reutilização de software. Através da herança, novas classes podem ser derivadas das classes existentes. A nova classe herda propriedades e métodos da classe base. A nova classe também pode adicionar suas próprias propriedades e métodos

Page 3: Herança

Herança

Para que serve a herança?

Considere a criação de uma classe ClasseB em Java.

Que métodos estão disponíveis através de uma referência para a ClasseB (isto é, um objeto)?

Page 4: Herança

Herança

Page 5: Herança

Herança

Suponha agora que a classe ClasseB herda de ClasseA

Que métodos estão agora disponíveis para uma referência da ClasseB (um objeto) ?

Page 6: Herança

Herança

Page 7: Herança

Herança

Poderoso mecanismo para o reaproveitamento de código

O objeto objB tem agora disponíveis os métodos da ClasseA sem ser necessário reescrevê-los na ClasseB

Um objeto da ClasseB também é um objeto da ClasseA.

Facilita a manutenção do código: Os métodos não são replicados. Se for necessário alterar o código do método m3, basta alterá-lo em ClasseA.

ClasseB pode "recusar" parte da herança reimplementando os métodos herdados

Page 8: Herança

Herança

O método m3 agora disponível para objB é aquele implementado em ClasseB

Page 9: Herança

Herança

Várias subclasses podem herdar da mesma superclasse

Page 10: Herança

Herança

Em Java, não é permitido herdar de mais de uma classe

ERRADO!!!!

Page 11: Herança

Herança

A hierarquia de herança pode ter vários níveis

Page 12: Herança

Herança

Que métodos estão agora disponíveis para uma instância de ClasseC?

Page 13: Herança

Herança

A Herança também pode surgir a partir da refatoração de classes existentes de modo a eliminar a duplicação de código

Grande quantidade de atributos e métodos duplicados...

Page 14: Herança

Herança

Refatoração

Superclasse(características comuns)

Subclasses(características específicas)

Page 15: Herança

Herança

O mecanismo de herança pode ser melhor entendido através do seguinte exemplo:

Page 16: Herança

Herança

A classe ContaBancaria tem quatro atributos: nome: armazena o nome do cliente cpf: armazena o número do CPF do cliente numeroConta: armazena o número da conta do cliente saldo: armazena o saldo da conta

Os métodos depositar e sacar são usados para fazer um depósito ou retirada da conta bancária.

A classe ContaBancária, sozinha, não é suficiente para realizar todas as transações bancárias. Existem geralmente dois tipos de contas: a conta corrente e a conta de investimentos

Page 17: Herança

Herança

Vamos derivar portanto duas subclasses que herdam da superclasse ContaCorrente

Page 18: Herança

Herança

As subclasses ContaInvestimento e ContaCorrente herdam os atributos e métodos da classe ContaBancaria

Page 19: Herança

Herança

Agora é possível fazer:

Apesar do método depositar não ter sido definido para a classe ContaCorrente, ele está disponível devido ao mecanismo de herança

Page 20: Herança

Composição

Page 21: Herança

Composição

A classe contém referências para objetos de outras classes

Estas referências são também atributos da classe

Uma maneira alternativa de estender a funcionalidade de uma classe agregando funcionalidades de outras classes

Herança vs. ComposiçãoÉ UM vs. TEM UM

Page 22: Herança

Composição

O mecanismo de herança nem sempre é apropriado

Java não tem herança múltipla

Estender funcionalidade através de herança pode não ser "natural":

Uma conta de investimento é uma conta bancária

Uma conta de investimento não é uma classe DecimalFormat!

Page 23: Herança

Composição

Considere a seguinte situação:

::Project2

CA

m1(...)m2(...)

CB

m3(...)m4(...)

Page 24: Herança

Composição

Considere agora que é preciso estender a funcionalidade da classe CA oferecendo em sua interface também os métodos m3( ) e m4( )

Page 25: Herança

Composição

1a solução: Implementar os métodos m3( ) e m4( ) na classe CA.

Desvantagem: duplicação de métodos dificulta a manutenção do

software

::Project2

CA

m1(...)m2(...)m3(...)m4(...)

CB

m3(...)m4(...)

Page 26: Herança

Composição

2a solução: Herança

Desvantagens: Conceitualmente, a

classe CA pode não SER uma classe CB

Java não suporta herança múltipla. E se fosse necessário oferecer os serviços m5() e m6() de uma classe CC?

::Project2

CA

m1(...)m2(...)

CB

m3(...)m4(...)

Page 27: Herança

Composição

3a solução: Composição

Page 28: Herança

Composição

Que serviços estão disponíveis para uma referência da classe CA?

Page 29: Herança

Composição

No entanto, é possível fazer:

Observe a utilização dos métodos m3 e m4 através de uma referência para a classe CB

Page 30: Herança

Composição

Esse processo é também conhecido por delegação: a classe CA delega à classe CB a execução dos serviços m3 e m4

Observe que o atributo b na classe A é público. Diz-se então que a delegação é pública, isto é, ela é visível para os clientes da classe

Um cliente da classe CA, para usar os métodos m3 e m4, deve estar ciente da delegação e fazer:

obj.b.m3();

Page 31: Herança

Composição

É possível tornar a delegação privada:

Page 32: Herança

Composição

Oferecer os serviços m3 e m4 na classe CA não significa, neste caso, duplicar código. Os métodos m3 e m4 em CA são apenas uma fachada para os métodos m3 e m4 em CB

Page 33: Herança

Composição

Que serviços estão agora disponíveis para uma referência da classe CA?

Observe que, agora, o cliente da classe não conhece a delegação: para ele tudo se passa como se os métodos m3 e m4 fossem implementados em CA

Page 34: Herança

Composição

Um exemplo no próprio Delphi: A classe System

Para imprimir uma String no console faz-se:

System.out.println("Alo Mundo!");

método da classe PrintStream

delegação

Page 35: Herança

Composição

Page 36: Herança

Um serviço oferecido por uma classe pode não ser exatamente uma fachada para a classe delegada, mas uma combinação de serviços oferecidos por esta.

Observe atentamente o código a seguir:

Composição

Page 37: Herança

public class Data { private int dia; private int mes; private int ano;

public Data(int d, int m, int a) { dia = d; mes = m; ano = a; }

public Data(String strData) { dia = Integer.parseInt(strData.substring(0, 2)); mes = Integer.parseInt(strData.substring(3, 5)); ano = Integer.parseInt(strData.substring(6)); }

public String toString() { // imprime a data no formato dd/mm/aaaa DecimalFormat df = new DecimalFormat("00"); return df.format(dia) + "/" + df.format(mes) + "/" + ano; }}

monta uma String no formato dd/mm/aaaa

df.format()se o campo tem apenas um dígito preenche com

um zero à esquerda

Page 38: Herança

public class Empregado { private Data admissao; private Data nascimento; private String nome;

public Empregado(Data admissao, Data nascimento, String nome) { this.admissao = admissao; this.nascimento = nascimento; this.nome = nome; }

public String toString() { return "nome: " + nome + "\nnascimento: " + nascimento.toString() + "\nadmissao: " + admissao.toString(); }

}

monta uma String contendo o nome, data de

nascimento e data de admissão do Empregado

Page 39: Herança

public class Teste { public static void main(String args[]) { String aux = EasyIn.getString("Data do aniversario[dd/mm/aaaa]: "); Data data1 = new Data(aux);

aux = EasyIn.getString("Data da admissao[dd/mm/aaaa]: "); Data data2 = new Data(aux);

aux = EasyIn.getString("nome: "); Empregado emp = new Empregado(data2, data1, aux); System.out.println(emp.toString()); }}

lê uma String contendo a data de aniversário e usa o método substring para separar o dia, o mês e o

ano

o mesmo para a data de admissão

instancia um objeto Empregado

invoca o método toString da classe Empregado.

Este, por sua vez, usa o método toString da classe

Data

Page 40: Herança

Data do aniversario[dd/mm/aaaa]: 09/03/1974

Data da admissao[dd/mm/aaaa]: 20/04/1994

nome: Rafael Marques

nome: Rafael Marques

nascimento: 09/03/1974

admissao: 20/04/1994

Process finished with exit code 0

Page 41: Herança

Composição

Vamos repetir o mesmo exemplo, dessa vez usando uma interface gráfica com o usuário

Observe a utilização das mesmas classes de negócio (Empregado e Data)

Page 42: Herança

class Data { private int dia; private int mes; private int ano;

public Data(int d, int m, int a) { dia = d; mes = m; ano = a; }

public Data(String strData) { dia = Integer.parseInt(strData.substring(0, 2)); mes = Integer.parseInt(strData.substring(3, 5)); ano = Integer.parseInt(strData.substring(6)); }

public String toString() { // imprime a data no formato dd/mm/aaaa DecimalFormat df = new DecimalFormat("00"); return df.format(dia) + "/" + df.format(mes) + "/" + ano; }}

Page 43: Herança

class Empregado { private Data admissao; private Data nascimento; private String nome;

public Empregado(Data admissao, Data nascimento, String nome) { this.admissao = admissao; this.nascimento = nascimento; this.nome = nome; }

public String toString() { return "nome: " + nome + "\nnascimento: " + nascimento.toString() + "\nadmissao: " + admissao.toString(); }}

Page 44: Herança

public class Form extends JFrame implements ActionListener { JTextField edtNasc, edtAdm, edtNome;

public Form() { super("Composição"); Container c = getContentPane(); c.setLayout(new FlowLayout());

c.add(new JLabel("Nome:")); edtNome = new JTextField(20); c.add(edtNome); c.add(new JLabel("Nascimento:")); edtNasc = new JTextField(10); c.add(edtNasc); c.add(new JLabel("Admissão:")); edtAdm = new JTextField(10); c.add(edtAdm); JButton btnImprime = new JButton("Imprime"); c.add(btnImprime); btnImprime.addActionListener(this);

this.setSize(400, 200); this.setVisible(true); }

Page 45: Herança

public static void main(String args[]) { new Form(); }

public void actionPerformed(ActionEvent e) { Data data1 = new Data(edtNasc.getText()); Data data2 = new Data(edtAdm.getText());

Empregado emp = new Empregado(data2, data1, edtNome.getText()); JOptionPane.showMessageDialog(null, emp.toString()); }}

Page 46: Herança