Introdução à Orientação a Objetos. O paradigma da Orientação a Objetos Um paradigma é uma...

Post on 07-Apr-2016

222 views 2 download

Transcript of Introdução à Orientação a Objetos. O paradigma da Orientação a Objetos Um paradigma é uma...

Introdução à Orientação a Objetos

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

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?

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.

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.

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.

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.

Orientação a Objetos - Princípios Um objeto pode ser composto por vários outros

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

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?”

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.

Objeto

• Definição:• 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

Abstração

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

Exemplos

Beija-Flor

Identidade: ‘o beija-flor que vem ao meu jardim’

Características:penas azuisbico finovôo rápido

Comportamento:voarpiar

Exemplo Pessoa

Identidade: ‘Mário’

Características:olhos pretosnasceu em 16/02/70pesa 70kg

mede 1,70mComportamento:

andarfalarcomerrir

Exemplo

Telefone

Identidade:: número 2576-0989

Características:azul2.4 GHztone

Comportamento:tocardiscar

Exemplo

ÔnibusIdentidade: placa LXY 7684

Características:cor amarela30 assentos

a diesel

Comportamento:frearandarcorrerbuzinaracelerar

Objeto

Representação

Mário

Características(estado)

Comportamento

Identidade

Serviços, Interface ou protocolo

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

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.

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)

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)

Exemplo

Características:cor das penas: azuisformato do bico: finovelocidade de vôo: rápida

Comportamento:voarpiar

Identidade::o beija-flor que vem ao meu jardim

classe

instância da classe (objeto)

Exemplo

Identidade:: meu pombo correioCaracterísticas:

cor das penas: cinzaformato do bico: curtovelocidade de vôo: média

Comportamento:voarpiar

classe

instância da classe (objeto)

Implementação em Delphi

A classe

O objeto

Implementação em Java

Implementação em VB

Exemplo

Identidade: ‘Telefone da minha casa’

Características:marca: Siemensnúmero: 2576-0989discagem: pulso

Comportamento:tocardiscar

classe

instância da classe (objeto)

Exemplo

classe

instância da classe (objeto)

Identidade: ‘Meu celular’

Características:marca: Nokianúmero: 99193467discagem: tom

Comportamento:tocardiscar

Implementação em Delphi

A classe

O objeto

ver anotações

Implementação em Java

Implementação em VB

Classes

Classe

Instâncias(objetos)

Implementação em Delphi

A classe

As instâncias

Implementação em Java

Implementação em Java

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 ReisNasc=28/01/1965Salário = 4.000

InformarSalárioCalcularIdade

Funcionário_Mário

Nome=Mário SáNasc=16/02/1970Salário = 3.000

InformarSalárioCalcularIdade

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 ReisNasc=28/01/1965Salário = 4.000

InformarSalárioCalcularIdade

Funcionário_Mário

Nome=Mário SáNasc=16/02/1970Salário = 3.000

InformarSalárioCalcularIdade

4000

3000

Informar Salário?

Implementação em Delphi

ver anotações

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

Operações/Métodos (Java)

Serviços/Operações Métodos só tem acesso aos dados da classe para a qual

foram definidos

CORRETO!

ERRADO!

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!

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

retorno etc

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

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

Passos para a criação de um objeto

1. Declarar uma referência para o objeto

func1: Funcionario;

2. Criar uma instância do objetofunc1 := 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.

Passos para a criação de um objeto

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

4. Modificação explícita do estado do objetofunc1.salario := 4000; // se o atributo é públicofunc1.gravaSalario(4000); // caso contrário

A referência para o objeto pode ser usada para alterar o estado dos atributos do objeto.

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.

O construtor padrão

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

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

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

Herança

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

Herança

Várias subclasses podem herdar da mesma superclasse

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

ERRADO!!!!

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

Herança

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

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ça Refatoração

Superclasse(características comuns)

Subclasses(características específicas)

Herança

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

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ça

Vamos derivar portanto duas subclasses que herdam da superclasse ContaCorrente

Herança

As subclasses ContaInvestimento e ContaCorrente herdam as propriedades e métodos da classe ContaBancaria

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

Composição

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çã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!

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

::Project2

CA

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

CB

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

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çã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(...)

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?

::Project2

CA

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

CB

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

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

::Project2

CA

b : CB

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

CB

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

Composição Que serviços estão

disponíveis para uma referência da classe CA?

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çã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ção É possível tornar a delegação privada:

::Project2

CA

b : CB

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

CB

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

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çã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çã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

Composição

::Unit1

::<<Unknown>>::TForm

TForm1

ListBox1 : TListBox

FormCreate(...)

TListBox

Items : TStringList

create(...)

TStringList

Add(...)

::Project2

Empregado

admissao : Datanascimento : Datanome : String

create(...)toString(...)

Data

ano : integerdia : integermes : integer

create(...)toString(...)

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

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 private nome: String; nascimento: Data; admissao: Data; public constructor create(nom: String; nas: Data; adm: Data); function toString(): String; end;

imprime a data no formato dd/mm/aaaa

imprime nome, data de nascimento e data de

admissão do Empregado

constructor Data.create(d, m, a: integer);begin dia := d; mes := m; ano := a;end;

function Data.toString: String;begin result := format('%0.2d/%0.2d/%0.4d', [dia, mes, ano]);end;

constructor Empregado.create(nom: String; nas, adm: Data);begin nome := nom; nascimento := nas; admissao := adm;end;

function Empregado.toString: String;begin result := 'nome: ' + nome + chr(13) + chr(10) + 'nascimento: ' + nascimento.toString + chr(13) + chr(10) + 'admissao: ' + admissao.toString;end;

%0.2dse o campo tem apenas um dígito preenche com

um zero à esquerda

chr(13)+chr(10)

muda de linha

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]: '); readln(aux); dia := StrToInt(copy(aux, 1, 2)); mes := StrToInt(copy(aux, 4, 2)); ano := StrToInt(copy(aux, 7, 4)); data2 := Data.Create(dia, mes, ano);

write('nome: '); readln(aux);

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 Empregadoinvoca o método toString

da classe Empregado. Este, por sua vez, usa o

método toString da classe Data

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)

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;

Data = class private dia: integer; mes: integer; ano: integer; public constructor create(d:integer; m:integer; a: integer); function toString(): String; end;

Empregado = class private nome: String; nascimento: Data; admissao: Data; public constructor create(nom: String; nas: Data; adm: Data); function toString(): String; end;

var Form1: TForm1;

implementation{$R *.DFM}constructor Data.create(d, m, a: integer);begin dia := d; mes := m; ano := a;end;

function Data.toString: String;begin result := format('%0.2d/%0.2d/%0.4d', [dia, mes, ano]);end;

constructor Empregado.create(nom: String; nas, adm: Data);begin nome := nom; nascimento := nas; admissao := adm;end;

function Empregado.toString: String;begin result := 'nome: ' + nome + chr(13) + chr(10) + 'nascimento: ' + nascimento.toString + chr(13) + chr(10) + 'admissao: ' + admissao.toString;end;

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.

Polimorfismo

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

Polimorfismo Conceito Chave

Objetos das subclasses podem ser tratados como objetos da superclasse

::Project2

A

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

B

m1(...)m3(...)

A classe B É UMA classe A Um objeto da classe B pode ser usado em qualquer lugar onde um objeto A é esperado.

B A

Polimorfismo Tabelas Virtuais

Classe Aoperação método invocadom1() A.m1()m2() A.m2()

::Project2

A

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

B

m1(...)m3(...)

Classe Boperação método invocadom1() B.m1()m2() A.m2()m3() B.m3()

Polimorfismo E

program Project2;{$APPTYPE CONSOLE}uses SysUtils;

type A = class procedure m1(); virtual; procedure m2(); end;

B = class(A) procedure m1(); override; procedure m3(); end; Falaremos disso mais

tarde...

procedure A.m1;begin writeln('A.m1()');end;

procedure A.m2;begin writeln('A.m2()');end;

procedure B.m1;begin writeln('B.m1()');end;

procedure B.m3;begin writeln('B.m3()');end;

mensagens de teste usadas para verificar a chamada dos métodos

Polimorfismo Programa de teste

var objA: A;begin objA := A.Create; objA.m1; objA.m2; readln;end.

::Project2

A

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

B

m1(...)m3(...)

Polimorfismo Outro programa de teste

var objB: B;begin objB := B.Create; objB.m1; objB.m2; objB.m3; readln;end.

::Project2

A

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

B

m1(...)m3(...)

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'); obj.m1; obj.m2; 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

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

::Project2

A

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

B

m1(...)m3(...)

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

Polimorfismo Conceito Chave

Objetos das subclasses podem ser tratados como objetos da superclasse

::Project2

A

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

B

m1(...)m3(...)

A classe B É UMA classe A Um objeto da classe B pode ser usado em qualquer lugar onde um objeto A é esperado.

B A

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

::Unit1 JWindows

close(...)maximize(...)minimize(...)move(...)open(...)

J Linux

close(...)maximize(...)minimize(...)move(...)open(...)

jWin: JWindows; jLin: JLinux;

Polimorfismoprocedure TForm1.FormCreate(Sender: TObject);begin if SO='Windows' then jWin := JWindows.Create else jLin := JLinux.Create;end;

procedure TForm1.WMSysCommand(var Message: TMessage);begin if (Message.wParam = SC_MINIMIZE) then if SO='Windows' then jWin.minimize else jLin.minimize else if (Message.wParam = SC_MAXIMIZE) then if SO='Windows' then jWin.maximize else jLin.maximize else if (Message.wParam = SC_CLOSE) then

Observe a quantidade de lógica condicional!

Polimorfismo Solução Polimórfica

::Unit1

JWindows

close(...)maximize(...)minimize(...)move(...)open(...)

J anela

close(...)maximize(...)minimize(...)move(...)open(...)

J Linux

close(...)maximize(...)minimize(...)move(...)open(...)

var jan: Janela;

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);begin 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 else inherited;end;

Polimorfismo Observe ainda como seria fácil acrescentar uma janela

MOTIF para o Sun Solaris ::Unit1

J anela

close(...)maximize(...)minimize(...)move(...)open(...)

JWindows

close(...)maximize(...)minimize(...)move(...)open(...)

J Linux

close(...)maximize(...)minimize(...)move(...)open(...)

J Solaris

close(...)maximize(...)minimize(...)move(...)open(...)

Polimorfismoprocedure 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);begin 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 else inherited;end;

Nada mudou aqui!

Acrescentei mais uma linha aqui

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

Polimorfismo Conceito Chave

Objetos das subclasses podem ser tratados como objetos da superclasse

::Project2

A

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

B

m1(...)m3(...)

A classe B É UMA classe A Um objeto da classe B pode ser usado em qualquer lugar onde um objeto A é esperado.

B A

Polimorfismoprogram Project2;{$APPTYPE CONSOLE}uses SysUtils;

type A = class procedure m1(); virtual; procedure m2(); end;

B = class(A) procedure m1(); override; procedure m3(); end;

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

Polimorfismo - Exercício Construa uma aplicação Delphi que implemente a

seguinte relação hierárquica entre as classes Passaro e BeijaFlor

::Unit1

Passaro

voa(...)

BeijaFlor

voa(...)

Polimorfismo - Exercício Interface com o usuário

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;

Polimorfismo

Polimorfismo