Paradigmas de Linguagens de Programação
BNF e Interpretador da
Linguagem Orientada a Objetos
Augusto Sampaio
Jackson, Jean, Patrícia, Saulo
Centro de Informática
Universidade Federal de Pernamburco
2012.1
BNF
• Mudança de paradigma: imperativa 1
=> OO1
• Conceitos fundamentais de orientação
a objetos ficaram de fora
• OO2 veio para adicionar Construtor
(de fato) e Herança
• http://www.cin.ufpe.br/~in1007/lingu
agens/OrientadaObjetos2/orientada
2
Objetos2.html
Construtor
• Métodos especiais chamados
automaticamente a cada criação de
um objeto
• Através do comando new
• Não possuem valor de retorno e tem o
mesmo nome da classe
3
Construtor
• Inicialmente, na linguagem OO1, não
existe a definição formal de
construtor
• A classe é criada através de um
construtor simples, sem ser possível
especializa-lo
• Linguagens mais sofisticadas
permitem essa capacidade
4
Construtor
• Classes Geradas
– NewOO2 (ListaExpressao)
– DecClasseSimplesOO2 (DecConstrutor)
– DecConstrutor (checaTipo,
getProcedimento)
– DefClasseOO2
– DecVariavelObjetoOO2
5
Construtor - NewOO2
6
Construtor - DecConstrutor
7
Exemplo Construtor
{
classe Eletrodomestico{
boolean ligado = false,
int voltagem = 220;
Eletrodomestico(boolean ligado, int
voltagem){
this.ligado := ligado;
this.voltagem := voltagem
},
proc ligar(){
this.ligado := true
},
proc desligar(){
this.ligado := false
},
8
Exemplo Construtor - Cont
proc imprimeEstado(){
write("Ligado: " ++ this.ligado);
write("Voltagem: " ++
this.voltagem)
}
};
{
Eletrodomestico eletro := new
Eletrodomestico(false,110);
eletro.imprimeEstado();
eletro.ligar();
eletro.imprimeEstado()
}
}
9
Herança
• Comandos Modificados:
– AtribuicaoOO2
– ChamadaMetodoOO2
– NewOO2
• Expressões modificadas:
– AcessoAtributoOO2
– AcessoAtributoThisOO2
10
Herança - AtribuicaoOO2
11
Herança ChamadaMetodoOO2
12
Herança - NewOO2
13
Herança Exemplo
classe Tv extends Eletrodomestico{
int canal = 3,
int volume = 0;
Tv(boolean ligado, int voltagem, int canal,
int volume){
this.ligado := ligado;
this.voltagem := voltagem;
this.canal := canal;
this.volume := volume
},
proc aumentarVolume(){
this.volume := this.volume + 1
},
proc diminuirVolume(){
if(not (this.volume == 0)) then {
this.volume := this.volume - 1
}
},
14
Herança Exemplo - Cont
proc imprimeEstadoTv(){
this.imprimeEstado();
write("Canal: " ++ this.canal);
write("Volume: " ++ this.volume)
}
};
{
Tv tv := new Tv(false,110,13,20);
write(tv.voltagem);write("------------------------");
tv.imprimeEstado();write("------------------------");
tv.imprimeEstadoTv();write("------------------------");
tv.aumentarVolume();
tv.imprimeEstadoTv()
}
15
Ambiente do Interpretador
• O ambiente inclui SETE componentes:
– uma pilha de mapeamentos de
identificadores em valores
– um mapeamento de referências em objetos
– a próxima referência disponível
– um mapeamento de identificadores em
definições de classes
– listas de valores de entrada e saída
– Lista de mapeamento de superclasses
[classe => superclasse]
Contexto do Objeto
• Cada objeto tem um estado
independente
• O estado do objeto (seu contexto) é
um mapeamento entre identificadores
e valores.
• Os identificadores são os atributos
desse objeto
17
<Tv, Eletrodomestico>
mapDefClasse<id, DefClasse>
Eletrodomestico =
DefClasse{{campos}, {metodos}}
ArrayList<SuperClasseMap>
Tv = DefClasse{{campos},
{metodos}}
proxRef = Ref0
Pilha Ids <id, valor>
{
classe Eletrodomestico{
//ligado, voltagem
//ligar, desligar, imprimeEstado
},
classe Tv extends Eletrodomestico{
//canal, volume
//aumentarVolume, diminuirVolume
//imprimeEstadoTv
Map de Objetos
<valorRef,objeto>
in
out
mapDefClasse<id, DefClasse>
<Tv, Eletrodomestico>
ArrayList<SuperClasseMap>
Eletrodomestico =
DefClasse{{campos}, {metodos}}
Tv = DefClasse{{campos},
{metodos}}
proxRef = Ref1
Ref0
EstadoObjTv0
EstadoObjTv0
volume=20
volume=0 ligado
ligado= =false,
false
voltagem == 110
220
Canal=13
Canal=3 voltagem
tv == null
Ref0
tv
Ref0 = ObjTv0
Pilha Ids <id, valor>
Map de Objetos
<valorRef,objeto>
…
{
Tv tv := new Tv(false,110,13,20);
…
in
out
mapDefClasse<id, DefClasse>
<Tv, Eletrodomestico>
ArrayList<SuperClasseMap>
Eletrodomestico =
DefClasse{{campos}, {metodos}}
Tv = DefClasse{{campos},
{metodos}}
proxRef = Ref1
Ref0
EstadoObjTv0
EstadoObjTv0
volume=20
volume=0 ligado
ligado= =false,
false
voltagem == 110
220
Canal=13
Canal=3 voltagem
tv = Ref0
Pilha Ids <id, valor>
Ref0 = ObjTv0
Map de Objetos
<valorRef,objeto>
…
tv.imprimeEstado();//metodo da superclasse
tv.imprimeEstadoTv()
}
in
out
TO-DO
•
•
•
•
Implementar Overloading
Implementar Polimorfismo
Adicionar operador super
Adicionar modificadores de acesso
21
Download

Linguagem Imperativa 1 - Centro de Informática da UFPE