A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Introdução à Orientação a Objetos

Apresentações semelhantes


Apresentação em tema: "Introdução à Orientação a Objetos"— Transcrição da apresentação:

1 Introdução à Orientação a Objetos

2 O paradigma da Orientação a Objetos
Um paradigma é uma forma de abordar um problema. O paradigma da orientação a objetos surgiu no fim dos anos 60. Hoje em dia, praticamente suplantou o paradigma anterior, o paradigma estruturado...

3 O paradigma da Orientação a Objetos
Alan Kay, um dos pais do paradigma da orientação a objetos, formulou a chamada analogia biológica. “Como seria um sistema de software que funcionasse como um ser vivo?

4 Analogia Biológica Cada “célula” interagiria com outras células através do envio de mensagens para realizar um objetivo comum. Adicionalmente, cada célula se comportaria como uma unidade autônoma.

5 Analogia Biológica De uma forma mais geral, Kay pensou em como construir um sistema de software a partir de agentes autônomos que interagem entre si. Com isso, ele estabeleceu os princípios da orientação a objetos.

6 Orientação a Objetos - Princípios
Tudo é um objeto. Pense em um objeto como uma super variável: ele armazena dados, mas você também pode fazer requisições a esse objeto, pedindo que ele faça operações sobre si próprio. Em teoria, você pode representar qualquer elemento conceitual no problema que você está tentando resolver (cachorros, livros, sócios, empréstimos, etc.) como um objeto no seu programa.

7 Orientação a Objetos - Princípios
Um programa é uma coleção de objetos dizendo uns aos outros o que fazer. Para fazer uma requisição a um objeto você “manda uma mensagem” para este objeto. Mais concretamente, você pode pensar em uma mensagem como sendo uma chamada de um procedimento ou função pertencente a um objeto em particular.

8 Orientação a Objetos - Princípios
Um objeto pode ser composto por vários outros objetos Em outras palavras: você pode criar um novo tipo de objeto empacotando objetos existentes. Dessa forma, você pode adicionar complexidade a um programa e escondê-la por trás da simplicidade de uso dos objetos.

9 Orientação a Objetos - Princípios
Todo objeto tem um tipo. Usando as palavras certas, cada objeto é uma instância de uma classe, onde classe é um sinônimo de tipo. A questão mais importante relativa a uma classe é “que mensagens eu posso enviar para uma instância dessa classe?”

10 Orientação a Objetos - Princípios
Todos os objetos de um dado tipo podem receber as mesmas mensagens. Além disso, uma vez que, por exemplo, um objeto do tipo “círculo” é também um objeto do tipo “forma geométrica”, o objeto “círculo” aceita qualquer mensagem endereçada a uma “forma geométrica”. Essa capacidade de “subtituição” de um objeto por outro é um dos mais poderosos conceitos em orientação a objetos.

11 Objeto Definição: Propósito: Objetos possuem:
Um conceito, uma abstração com significado específico em um contexto Propósito: Entidade de software que reflete de alguma forma o mundo real Representar uma entidade do mundo real Objetos possuem: Identidade Conjunto de características que determinam seu estado Comportamento específico definido por um conjunto de ações

12 Abstração Uma abstração é qualquer modelo que inclui os aspectos relevantes de alguma coisa, ao mesmo tempo em que ignora os menos importantes.

13 Exemplos Beija-Flor Identidade: ‘o beija-flor que vem ao meu jardim’
Características: penas azuis bico fino vôo rápido Comportamento: voar piar

14 Exemplo Pessoa Identidade: ‘Mário’ Características: olhos pretos
nasceu em 16/02/70 pesa 70kg mede 1,70m Comportamento: andar falar comer rir

15 Exemplo Telefone Identidade:: número 2576-0989 Características: azul
2.4 GHz tone Comportamento: tocar discar

16 Exemplo Ônibus Identidade: placa LXY 7684 Características: cor amarela
30 assentos a diesel Comportamento: frear andar correr buzinar acelerar

17 Objeto Representação Serviços, Interface ou protocolo Mário Identidade
Características (estado) Mário Comportamento Serviços, Interface ou protocolo

18 Objeto Implementação Interface Visível Conjunto de operações
Parte encapsulada (escondida) Estado do Objeto - Atributos Implementação de suas operações - Métodos Estado do Objeto (valor de seus atributos) Serviços, Operações ou Interface da Classe

19 Encapsulamento Na terminologia da orientação a objetos, diz-se que um objeto possui uma interface. A interface de um objeto é o que ele conhece e o que ele sabe fazer, sem descrever como o objeto conhece ou faz. A interface de um objeto define os serviços que ele pode realizar e conseqüentemente as mensagens que ele recebe.

20 Encapsulamento Uma interface pode ter várias formas de implementação.
Mas, pelo Princípio do Encapsulamento, a implementação de um serviço no objeto servidor não importa para o objeto cliente. (O cliente confia em interfaces e não em implementações)

21 Classe Definição: Abstrações utilizadas para representar um conjunto de objetos com características e comportamento idênticos Uma classe pode ser vista como uma “fábrica de objetos” Tecnicamente falando, objetos são “instâncias” em tempo de execução de uma classe Todos os objetos são instâncias de alguma classe Todos os objetos de uma classe são idênticos no que diz respeito a sua interface e implementação (o que difere um objeto de outro é seu estado e sua identidade)

22 Exemplo classe Identidade::o beija-flor que vem ao meu jardim
Características: cor das penas: azuis formato do bico: fino velocidade de vôo: rápida instância da classe (objeto) Comportamento: voar piar

23 Exemplo classe Identidade:: meu pombo correio Características:
cor das penas: cinza formato do bico: curto velocidade de vôo: média instância da classe (objeto) Comportamento: voar piar

24 Implementação em Delphi
A classe O objeto

25 Implementação em Java

26 Implementação em VB

27 Exemplo classe Identidade: ‘Telefone da minha casa’ Características:
marca: Siemens número: discagem: pulso instância da classe (objeto) Comportamento: tocar discar

28 Exemplo classe Identidade: ‘Meu celular’ Características: marca: Nokia
número: discagem: tom instância da classe (objeto) Comportamento: tocar discar

29 Implementação em Delphi
A classe O objeto // criar uma aplicação console no Delphi // File, New..., Console Application program Project2; {$APPTYPE CONSOLE} uses SysUtils; type Telefone = class // atributos marca: String; numero: String; discagem: String; // metodos procedure tocar(); procedure discar(); end; // definição dos métodos da classe Telefone procedure Telefone.discar; begin Writeln('discando...'); procedure Telefone.tocar; Writeln('tocando...'); var // declaração da referência para o objeto meuCelular: Telefone; // instanciando o objeto meuCelular meuCelular := Telefone.Create; // configurando o estado do objeto meuCelular.marca := 'Nokia'; meuCelular.numero := ' '; meuCelular.discagem := 'tom'; // invocando métodos (comportamento) do objeto meuCelular.tocar; meuCelular.discar; readln; end. ver anotações

30 Implementação em Java

31 Implementação em VB

32 Classes Classe Instâncias (objetos)

33 Implementação em Delphi
A classe As instâncias

34 Implementação em Java

35 Implementação em Java

36 Atributos Descrevem as características das instâncias de uma classe
Seus valores definem o estado do objeto O estado de um objeto pode mudar ao longo de sua existência A identidade de um objeto, contudo, nunca muda Funcionário_Helena Nome=Helena Reis Nasc=28/01/1965 Salário = 4.000 InformarSalário CalcularIdade Funcionário_Mário Nome=Mário Sá Nasc=16/02/1970 Salário = 3.000 InformarSalário CalcularIdade

37 Serviços/Operações Representam o comportamento das instâncias de uma classe Correspondem ao protocolo ou ações das instâncias de uma classe Funcionário_Helena Nome=Helena Reis Nasc=28/01/1965 Salário = 4.000 InformarSalário CalcularIdade 4000 Funcionário_Mário Nome=Mário Sá Nasc=16/02/1970 Salário = 3.000 InformarSalário CalcularIdade 3000 Informar Salário?

38 Implementação em Delphi
program Project2; {$APPTYPE CONSOLE} uses SysUtils; // criação do tipo da classe type Funcionario = class // atributos nome: String; nasc: String; salario: double; // metodos function informarSalario: double; function calcularIdade: integer; end; // definição dos métodos da classe Funcionario function Funcionario.calcularIdade: integer; var ano, mes, dia: Word; begin DecodeDate(StrToDate(nasc), ano, mes, dia); writeln('idade: ', 2005-ano); function Funcionario.informarSalario: double; writeln('salario: ', salario:0:2); // declara as referencias para as instancias func1, func2: Funcionario; ShortDateFormat := 'dd/mm/yyyy'; // cria uma instancia de Funcionario func1 := Funcionario.Create; // determina o estado da instancia func1.nome := 'Helena Reis'; func1.nasc := '28/01/1965'; func1.salario := 4000; // cria outra instancia de Funcionario func2 := Funcionario.Create; func2.nome := 'Mario Sa'; func2.nasc := '16/02/1970'; func2.salario := 3000; // fazendo uso dos serviços func1.calcularIdade; func1.informarSalario; func2.calcularIdade; func2.informarSalario; readln; end. ver anotações

39 Operações/Métodos Um método é a implementação de uma operação

40 Operações/Métodos (Java)

41 Serviços/Operações Métodos só tem acesso aos dados da classe para a qual foram definidos CORRETO! ERRADO!

42 Serviços/Operações Os dados de uma classe só podem ser manipulados por métodos da classe (pelo princípio do encapsulamento) ERRADO! ERRADO! CORRETO!

43 Serviços/Métodos Métodos possuem argumentos, variáveis locais , valor de retorno etc

44 Serviços/Métodos Alguns métodos especiais:
Construtores – criam objetos de uma classe Destrutores – destroem objetos de uma classe 1ª alternativa: Sem um método construtor A classe herda um construtor padrão de TObject

45 O método construtor 2ª alternativa: fazendo uso de um método construtor

46 Passos para a criação de um objeto
Declarar uma referência para o objeto func1: Funcionario; Criar uma instância do objeto func1 := Funcionario.Create; O sistema operacional aloca espaço em memória para o novo objeto e preenche os seus atributos com valores default (zero para números, nil para referências, false para booleanos, string vazia para Strings.

47 Passos para a criação de um objeto
Se houver um método construtor, este é invocado O método construtor é usado para alterar os valores default dos atributos possibilitando que o objeto se torne disponível para a aplicação já em um estado pré-definido Modificação explícita do estado do objeto func1.salario := 4000; // se o atributo é público func1.gravaSalario(4000); // caso contrário A referência para o objeto pode ser usada para alterar o estado dos atributos do objeto.

48 O método construtor (FAQ)
É obrigatória a inclusão de um método construtor na classe? Não. Um construtor default é herdado de TObject. Este construtor aloca espaço para o novo objeto em memória e cria um objeto com os atributos e referências todas preenchidas com zeros. Quando então devo escrever um método construtor? Quando houver atributos privados que não possam mais ser alterados uma vez que o objeto tenha sido instanciado Quando o objeto for um objeto complexo, cuja arquitetura interna (atributos e referências) não é conhecida pelo programador.

49 O construtor padrão

50 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

51 Herança Para que serve a herança? Considere a criação de uma classe ClasseB em Delphi Que métodos estão disponíveis através de uma referência para a ClasseB (isto é, um objeto)?

52 Herança

53 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) ?

54 Herança

55 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

56 Herança O método m3 agora disponível para objB é aquele implementado em ClasseB

57 Herança Várias subclasses podem herdar da mesma superclasse

58 Herança Em Delphi, não é permitido herdar de mais de uma classe
ERRADO!!!!

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

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

61 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...

62 Herança Refatoração Superclasse (características comuns)
Subclasses (características específicas)

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

64 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

65 Herança Vamos derivar portanto duas subclasses que herdam da superclasse ContaCorrente

66 Herança As subclasses ContaInvestimento e ContaCorrente herdam as propriedades e métodos da classe ContaBancaria

67 Herança Agora é possível fazer:
Apesar do construtor create e do método depositar não terem sido definidos para a classe ContaCorrente, eles estão disponíveis devido ao mecanismo de herança

68 Composição

69 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

70 Composição O mecanismo de herança nem sempre é apropriado
Delphi 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 TColor!

71 Composição Considere a seguinte situação:

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

73 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

74 Composição 2a solução: Herança Desvantagens:
Conceitualmente, a classe CA pode não SER uma classe CB Delphi não suporta herança múltipla. E se fosse necessário oferecer os serviços m5() e m6() de uma classe CC?

75 Composição 3a solução: Composição

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

77 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

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

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

80 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

81 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

82 Composição Um exemplo no próprio Delphi: A listbox
Para incluir uma nova linha em uma listbox faz-se: ListBox1.Items.Add('MS'); método da classe TStringList delegação

83 Composição

84 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: admissao nascimento

85 imprime a data no formato dd/mm/aaaa
program Project2; {$APPTYPE CONSOLE} uses SysUtils; type Data = class private dia: integer; mes: integer; ano: integer; public constructor create(d:integer; m:integer; a: integer); function toString(): String; // imprime a data no formato dd/mm/aaaa end; Empregado = class nome: String; nascimento: Data; admissao: Data; constructor create(nom: String; nas: Data; adm: Data); function toString(): String; imprime a data no formato dd/mm/aaaa imprime nome, data de nascimento e data de admissão do Empregado

86 %0.2d se o campo tem apenas um dígito preenche com um zero à esquerda
constructor Data.create(d, m, a: integer); begin dia := d; mes := m; ano := a; end; function Data.toString: String; result := format('%0.2d/%0.2d/%0.4d', [dia, mes, ano]); constructor Empregado.create(nom: String; nas, adm: Data); nome := nom; nascimento := nas; admissao := adm; function Empregado.toString: String; result := 'nome: ' + nome + chr(13) + chr(10) + 'nascimento: ' + nascimento.toString + chr(13) + chr(10) + 'admissao: ' + admissao.toString; %0.2d se o campo tem apenas um dígito preenche com um zero à esquerda chr(13)+chr(10) muda de linha

87 o mesmo para a data de admissão
var emp: Empregado; data1, data2: Data; aux: string; dia, mes, ano: integer; begin write('Data do aniversario[dd/mm/aaaa]: '); readln(aux); dia := StrToInt(copy(aux, 1, 2)); mes := StrToInt(copy(aux, 4, 2)); ano := StrToInt(copy(aux, 7, 4)); data1 := Data.Create(dia, mes, ano); write('Data da admissao[dd/mm/aaaa]: '); data2 := Data.Create(dia, mes, ano); write('nome: '); emp := Empregado.create(aux, data1, data2); writeln(emp.toString); readln; end. lê uma String contendo a data de aniversário e usa a função Copy 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

88

89 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)

90 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; edtNome: TEdit; edtNasc: TEdit; edtAdm: TEdit; btnImprime: TButton; procedure btnImprimeClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

91 Data = class private dia: integer; mes: integer; ano: integer; public constructor create(d:integer; m:integer; a: integer); function toString(): String; end; Empregado = class nome: String; nascimento: Data; admissao: Data; constructor create(nom: String; nas: Data; adm: Data); var Form1: TForm1;

92 implementation {$R *.DFM} constructor Data.create(d, m, a: integer); begin dia := d; mes := m; ano := a; end; function Data.toString: String; result := format('%0.2d/%0.2d/%0.4d', [dia, mes, ano]); constructor Empregado.create(nom: String; nas, adm: Data); nome := nom; nascimento := nas; admissao := adm; function Empregado.toString: String; result := 'nome: ' + nome + chr(13) + chr(10) + 'nascimento: ' + nascimento.toString + chr(13) + chr(10) + 'admissao: ' + admissao.toString;

93 procedure TForm1.btnImprimeClick(Sender: TObject);
var emp: Empregado; data1, data2: Data; dia, mes, ano: integer; begin dia := StrToInt(copy(edtNasc.Text, 1, 2)); mes := StrToInt(copy(edtNasc.Text, 4, 2)); ano := StrToInt(copy(edtNasc.Text, 7, 4)); data1 := Data.Create(dia, mes, ano); dia := StrToInt(copy(edtAdm.Text, 1, 2)); mes := StrToInt(copy(edtAdm.Text, 4, 2)); ano := StrToInt(copy(edtAdm.Text, 7, 4)); data2 := Data.Create(dia, mes, ano); emp := Empregado.create(edtNome.Text, data1, data2); ShowMessage(emp.toString); end; end.

94

95 Polimorfismo

96 Polimorfismo "Programação Genérica"
Trata objetos na mesma hierarquia de classes como se todos fossem objetos da superclasse Tornam o programa extensível Facilidade para adicionar novas classes Nesta seção: invocaremos os métodos das subclasses usando referências para a superclasse

97 Polimorfismo Conceito Chave Objetos das subclasses podem ser tratados como objetos da superclasse A classe B É UMA classe A  Um objeto da classe B pode ser usado em qualquer lugar onde um objeto A é esperado. B A

98 Polimorfismo Tabelas Virtuais Classe A operação método invocado m1()
A.m1() m2() A.m2() Classe B operação método invocado m1() B.m1() m2() A.m2() m3() B.m3()

99 Polimorfismo E Falaremos disso mais tarde... program Project2;
{$APPTYPE CONSOLE} uses SysUtils; type A = class procedure m1(); virtual; procedure m2(); end; B = class(A) procedure m1(); override; procedure m3(); Polimorfismo E Falaremos disso mais tarde...

100 mensagens de teste usadas para verificar a chamada dos métodos
procedure A.m1; begin writeln('A.m1()'); end; procedure A.m2; writeln('A.m2()'); procedure B.m1; writeln('B.m1()'); procedure B.m3; writeln('B.m3()'); mensagens de teste usadas para verificar a chamada dos métodos

101 Polimorfismo Programa de teste var objA: A; begin objA := A.Create;
objA.m1; objA.m2; readln; end.

102 Polimorfismo Outro programa de teste var objB: B; begin
objB := B.Create; objB.m1; objB.m2; objB.m3; readln; end.

103 Polimorfismo E agora a mágica!
var obj: A; begin obj := A.Create; writeln('obj := A.Create'); obj.m1; obj.m2; writeln; obj := B.Create; writeln('obj := B.Create'); readln; end. A referência para a superclasse é usada para instanciar objetos da superclasse (Classe A) e da subclasse (Classe B) Por que o compilador não acusa um erro? Porque um objeto da classe B é também um objeto da classe A

104 Polimorfismo var obj: A; begin obj := A.Create;
writeln('obj := A.Create'); obj.m1; obj.m2; writeln; obj := B.Create; writeln('obj := B.Create'); readln; end.

105 Polimorfismo "Programação Genérica"
Trata objetos na mesma hierarquia de classes como se todos fossem objetos da superclasse Tornam o programa extensível Facilidade para adicionar novas classes Nesta seção: invocaremos os métodos das subclasses usando referências para a superclasse

106 Polimorfismo Conceito Chave Objetos das subclasses podem ser tratados como objetos da superclasse A classe B É UMA classe A  Um objeto da classe B pode ser usado em qualquer lugar onde um objeto A é esperado. B A

107 Polimorfismo Chamadas polimórficas permitem simplificar a lógica condicional dos programas Imagine um sistema construído para trabalhar tanto em Windows quanto em Linux jWin: JWindows; jLin: JLinux;

108 Polimorfismo Observe a quantidade de lógica condicional!
procedure TForm1.FormCreate(Sender: TObject); begin if SO='Windows' then jWin := JWindows.Create else jLin := JLinux.Create; end; procedure TForm1.WMSysCommand(var Message: TMessage); if (Message.wParam = SC_MINIMIZE) then jWin.minimize jLin.minimize else if (Message.wParam = SC_MAXIMIZE) then jWin.maximize jLin.maximize else if (Message.wParam = SC_CLOSE) then Observe a quantidade de lógica condicional!

109 Polimorfismo Solução Polimórfica var jan: Janela;

110 Polimorfismo Observe a ausência de lógica condicional
procedure TForm1.FormCreate(Sender: TObject); begin if SO='Windows' then jan := JWindows.Create else jan := JLinux.Create; end; procedure TForm1.WMSysCommand(var Message: TMessage); if (Message.wParam = SC_MINIMIZE) then jan.minimize else if (Message.wParam = SC_MAXIMIZE) then jan.maximize else if (Message.wParam = SC_CLOSE) then jan.close else if (Message.wParam = SC_MOVE) then jan.move inherited; Observe a ausência de lógica condicional

111 Polimorfismo Observe ainda como seria fácil acrescentar uma janela MOTIF para o Sun Solaris

112 Polimorfismo Acrescentei mais uma linha aqui Nada mudou aqui!
procedure TForm1.FormCreate(Sender: TObject); begin if SO='Windows' then jan := JWindows.Create else if SO = 'Linux' then jan := JLinux.Create else jan := JSolaris.Create; end; procedure TForm1.WMSysCommand(var Message: TMessage); if (Message.wParam = SC_MINIMIZE) then jan.minimize else if (Message.wParam = SC_MAXIMIZE) then jan.maximize else if (Message.wParam = SC_CLOSE) then jan.close else if (Message.wParam = SC_MOVE) then jan.move inherited; Acrescentei mais uma linha aqui Nada mudou aqui!

113 Polimorfismo "Programação Genérica"
Trata objetos na mesma hierarquia de classes como se todos fossem objetos da superclasse Tornam o programa extensível Facilidade para adicionar novas classes Nesta seção: invocaremos os métodos das subclasses usando referências para a superclasse

114 Polimorfismo Conceito Chave Objetos das subclasses podem ser tratados como objetos da superclasse A classe B É UMA classe A  Um objeto da classe B pode ser usado em qualquer lugar onde um objeto A é esperado. B A

115 Polimorfismo Mas o que são afinal esses sufixos?
program Project2; {$APPTYPE CONSOLE} uses SysUtils; type A = class procedure m1(); virtual; procedure m2(); end; B = class(A) procedure m1(); override; procedure m3(); Mas o que são afinal esses sufixos? Por ora, fiquemos assim: se você não colocar o virtual na superclasse e o override nas subclasses, a brincadeira não funciona! O par virtual/override deve ser usado apenas nos métodos que devem ser chamados de forma polimórfica

116 Polimorfismo - Exercício
Construa uma aplicação Delphi que implemente a seguinte relação hierárquica entre as classes Passaro e BeijaFlor

117 Polimorfismo - Exercício
Interface com o usuário

118 Polimorfismo - Exercício
Requisitos: O método voa deve ser invocado de forma polimórfica: A resposta depende do objeto instanciado... procedure TForm1.Button1Click(Sender: TObject); begin p.voa; end;

119 Polimorfismo

120 Polimorfismo


Carregar ppt "Introdução à Orientação a Objetos"

Apresentações semelhantes


Anúncios Google