O Poder do Polimorfismo
Fábio Bissolotti
Polimorfismo -- Agenda
O que é polimorfismo
Herança e sobrescrita de método (overriding)
Implementando interfaces
/** super.p **/
PROCEDURE DoIt:
/* common behavior*/
END PROCEDURE.
O Que as Super Procedures Oferecem?
O princípio do Polimorfismo!
/** run.p **/
RUN Super.p SET hDoIt.
h:ADD-SUPER-PROCEDURE(hDoIt).
PROCEDURE DoIt:
/* customized behavior */
RUN SUPER.
END PROCEDURE.
Alguns recursos para a
programação genérica
Alguns recursos para
customizar
comportamento
Alguns recursos para
customizar respostas a
mensagens
Comportamento diferenciado para
Tipos específicos
Comportamento comum a todos
os Tipos
O Que é Poliformismo?
Cliente
Doméstico
Cliente
Preferencial
Cliente
Internacional
Cliente
Cliente
Interno
Informações p/ Contato
Cálculo de Entrega
Emissão de Relatórios
Assinatura de mailing list Endereço Alternativo p/ FaturamentoHerança
Cliente
Doméstico
Preferencial
Cliente
CLASS DomCust INHERITS Cust CLASS PreCust INHERITS Cust
Cliente
Informações p/ Contato
Cálculo de Entrega
Emissão de Relatórios
Informações p/ Contato
Cálculo de Entrega
Emissão de Relatórios
Vocabulário
OBJETO
Uma entidade com propriedades que a
descrevem e comportamento p/ manipulá-la
TIPO
Uma categoria de dados que pode ter valores,
um formato que o denote e operações que
agem sobre ele
SUPER CLASSE Uma classe que especifica dados e
compor-tamento comuns à categoria de objetos
SUBCLASSE
Uma classe que herda um super tipo,
adqui-rindo dados e comportamento comuns, além
de declarar os seus próprios
Tipos Definidos Pelo Usuário
Cliente
Tipos embutidos: INTEGER, CHARACTER, HANDLE etc…
DEFINE VARIABLE myvar AS INTEGER.
Tipos definidos pelo
usuário
DEFINE VARIABLE DomObj AS CLASS DomCust.
DomObj = NEW DomCust().
DomObj
refere-se a uma instância de um Cliente Doméstico
DEFINE VARIABLE CustObj AS CLASS Cust.
CustObj = NEW DomCust().
Custobj
refere-se a uma instância de um Cliente Doméstico
ou um Cliente Internacional
ou um Cliente Preferencial
ou qualquer outra subclasse de
Cust...
Herança e Referências a Objetos
Cliente
Preferencial
Cliente
Doméstico
É um tipo de
Cliente
Cliente
É um tipo de
DEF VARIABLE CustObj1 AS CLASS Cust.
DEF VARIABLE CustObj2 AS CLASS Cust.
CustObj1 = NEW DomCust( ).
CustObj2 = NEW PreCust( ).
MESSAGE CustObj1:CalcShipping( ).
MESSAGE CustObj2:CalcShipping( ).
Acessando Informações Adicionais
Cliente
Preferencial
Cliente
CAST(CustObj1, PreCust):AddToMailList
Cliente
Doméstico
Assinatura de mailing list Endereço Alternativo p/ FaturamentoInformações p/ Contato
Cálculo de Entrega
Emissão de Relatórios
Informações p/ Contato
Cálculo de Entrega
Emissão de Relatórios
Informações p/ Contato
Cálculo de Entrega
Emissão de Relatórios
Métodos definidos em super classes
•
Comportamento comum aos tipos
Métodos sobrescritos na subclasse
•
Comportamento específico ao tipo
•
Acesso a dados específicos
•
Cálculos especializados
Sobrescrita de Método (Overriding)
Cliente
Cliente
Doméstico
METHOD PUBLIC INTEGER CalcShipping( ):
$
13.99
Spring St,
Boston
Herança e Sobrescrita de Método
Cliente
Qual o valor da entrega?
Onde o cliente está
localizado?
CalcShipping()
GetCustomerInfo()
Cliente
Doméstico
Main St,
Chicago
FREE
Herança e Sobrescrita de Método
Cliente
Preferencial
Cliente
Qual o valor da entrega?
Onde o cliente está
localizado?
CalcShipping()
O Que Está Acontecendo…
1. Define uma variável genérica
CustObj
para um objeto Cliente
Cliente
3. Invoca
CalcShipping()
CustObj:CalcShipping()
2. Atribui a variável a um novo objeto
Cliente Doméstico
Cliente
Doméstico
4. Método sobrescrito executado em
METHOD PUBLIC OVERRIDE INT CalcShipping( ):
SUPER:CalcShipping( ).
/* type-specific behavior */
END METHOD.
Acessando Comportamento Comum
Pré-processamento: executa método da super
classe antes do comportamento específico
Pós-processamento: executa método da super
classe depois do comportamento específico
METHOD PUBLIC OVERRIDE INT CalcShipping( ):
/* type-specific behavior */
SUPER:CalcShipping( ).
END METHOD.
Acessando Comportamento Comum
Pré-processamento: executa método da super
classe antes do comportamento específico
Pós-processamento: executa método da super
classe depois do comportamento específico
METHOD PUBLIC OVERRIDE INT CalcShipping( ):
SUPER:CalcShipping().
/* type-specific behavior */
PrintReport( ).
END METHOD.
Acessando Comportamento Comum
A subclasse tem acesso ao comportamento
comum definido na super classe
Calcula taxas
comuns de envio
Emite o
relatório
Cliente
Doméstico
Acessando Comportamento Comum
Cliente
$13.99
Qual o valor da entrega?
O Que Está Acontecendo…
1.
Usando a variável genérica
CustObj,
invoca
CalcShipping().
CustObj:CalcShipping()
2. Método sobrescrito executado em Cliente Doméstico,
não em Cliente
METHOD PUBLIC OVERRIDE INT CalcShipping( ):
SUPER:CalcShipping().
/* type-specific behavior */
PrintReport( ).
Acessa Situação de Crédito Calcula Total da Ordem
Acessa Situação de Crédito
Calcula Total da Ordem
Interfaces
Acessa Situação de Crédito Calcula Total da Ordem