heran a
Download
Skip this Video
Download Presentation
Herança

Loading in 2 Seconds...

play fullscreen
1 / 46

Herança - PowerPoint PPT Presentation


  • 82 Views
  • Uploaded on

Herança. Herança. O que é herança ?

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Herança' - read


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
heran a1
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
heran a2
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)?
heran a4
Herança
  • Suponha agora que a classe ClasseB herda de ClasseAQue métodos estão agora disponíveis para uma referência da ClasseB (um objeto) ?
heran a6
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
heran a7
Herança

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

heran a8
Herança
  • Várias subclasses podem herdar da mesma superclasse
heran a9
Herança
  • Em Java, não é permitido herdar de mais de uma classe

ERRADO!!!!

heran a10
Herança
  • A hierarquia de herança pode ter vários níveis
heran a11
Herança
  • Que métodos estão agora disponíveis para uma instância de ClasseC?
heran a12
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...

heran a13
Herança
  • Refatoração

Superclasse(características comuns)

Subclasses(características específicas)

heran a14
Herança
  • O mecanismo de herança pode ser melhor entendido através do seguinte exemplo:
heran a15
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
heran a16
Herança
  • Vamos derivar portanto duas subclasses que herdam da superclasse ContaCorrente
heran a17
Herança

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

heran a18
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

composi o1
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
composi o2
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!
composi o3
Composição
  • Considere a seguinte situação:
composi o4
Composição
  • Considere agora que é preciso estender a funcionalidade da classe CA oferecendo em sua interface também os métodos m3( ) e m4( )
composi o5
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
composi o6
Composição
  • 2asoluçã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?
composi o7
Composição
  • 3a solução: Composição
composi o8
Composição
  • Que serviços estão disponíveis para uma referência da classe CA?
composi o9
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
composi o10
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();

composi o11
Composição
  • É possível tornar a delegação privada:
composi o12
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
composi o13
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
composi o14
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

composi o16
Composição
  • 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:
slide37

public class Data {

privateint dia;

privateint mes;

privateint 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

slide38

publicclass 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

slide39

publicclass Teste {

publicstaticvoid 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

slide40

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

composi o17
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)
slide42

class Data {

privateint dia;

privateint mes;

privateint 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;

}

}

slide43

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();

}

}

slide44

publicclass 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);

}

slide45

publicstaticvoid main(String args[]) {

new Form();

}

publicvoid 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());

}

}

ad