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