Fiz uma modificação na biblioteca de Classes (orientação a objetos) e adicionei uma função que permite inclusão de um construtor para personalizar a criação de novos objetos.
Não se preocupe, há compatibilidade total com a versão anterior.
Antes se instanciava um novo objeto de uma classe unicamente com o método:
1 |
:novo(); |
Agora é possível criar a própria função construtora, executando a tabela como se fosse uma função, veja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
inclua'classe' //nome da lib é com letra minuscula //classe cliente: cliente = Classe{//Nome da funcao é iniciada com maiuscula. nome='Sem Nome' //valor padrao ; //não se esqueça de separar cada dado com ponto-e-vírgula ou vírgula tel='000000000000000' //valor padrao ; } //funcao construtora funcao cliente:construtor(nome,tel) este.nome=nome; este.tel=tel; fim //outros métodos: funcao cliente:mostre() imprima('Cliente:',este.nome, 'Tel:', este.tel); fim funcao cliente:def_nome(nome) este.nome=nome; fim funcao cliente:def_tel(tel) este.tel=tel; fim //------------------------- FIM CLASSE CLIENTE ----------; //agora vc pode chamar a tabela como se fosse uma funcao //e será chamada a funcao construtor automaticamente, veja: //criando um objeto cliente cliente1 = cliente('Mario','65 9 9999-9999'); cliente1:mostre(); cliente1:def_nome('Mario Alfonso'); cliente1:mostre();//mostra a alteracao; //instanciando outro objeto cliente2 = cliente(); cliente2->def_tel('66 9 9988-9999'); cliente2:def_nome('JOAO APARECIDO'); cliente2->mostre(); //se quiser use o metodo antigo sem problemas. cliente3 = cliente:novo{nome='JESSICA',tel='65 9 9000-000'} cliente3:mostre(); |
Esta nova biblioteca classe.pris estará disponível em nova versão prisma.
Se você gostaria de usar copie o código abaixo e salve como classe.pris (sem compilar mesmo) no diretório padrão Prisma, ou na pasta onde está o programa que irá usá-la.
(No Linux é: /usr/local/share/prisma/1.0/plib/
No Windows é: C:\\Prisma\\1.0\\bin\\plibs\\ )
Segue o código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//implementação de classes com multiplas heranças //convertido para prismabr //a partir do manual programming in lua 3ed. local funcao search ( k , plist ) para i = 1 , #plist inicio local v = plist[i][k] se v entao retorne v fim fim fim //fim funcao search funcao Classe(...) local c = {} ; //nova classe local parents = { ... }; funcao c:novo ( o ) o = o ou {} defmetatabela( o , c ); retorne o fim defmetatabela ( c , { __index = funcao( t , k ) retorne search ( k , parents ) fim; __call = funcao(este,...) local obj = este:novo(); obj:construtor(...); retorne obj; fim} ) ;//fim defmetatabela c.__index = c; retorne c; fim |
Observe que eu pesquisei no livro Programming in Lua para conseguir trazer esta funcionalidade para Prisma.
Sempre que puder, vou reaproveitar códigos já existentes em Lua, afinal, para que reinventar a roda se ela já existe.
Em alguns casos, devido à licença ou complexidade, irei eu mesmo fazer a biblioteca se necessário, como já fiz antes (igpbr.so, psqlite3, entre outras);
Note que nos exemplos usei dois pontos (:) para acessar os métodos, ou hífen e maior que (->), tanto faz, use a forma que preferir, obj->mostre ou obj:mostre();
É necessário usar esses sinais quando se quer passar o próprio objeto automaticamente como parâmetro especial ‘este’;
*** Se preferir pode criar os métodos de uma classe na própria classe e não depois como no exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
inclua'classe' retangulo = Classe{ alt = 10 //altura padrao ; larg = 40 //larg padrao ; //metodo construtor: construtor = funcao(este,alt,larg) este.alt=alt; este.larg=larg; fim ; }//fim Classe |
A diferença quando se declara uma função dentro de uma tabela é que devemos fazer como se estivéssemos declarando uma variável qualquer:
nome_func = funcao(este) … fim
E devemos, também, passar o parâmetro este explicitamente, pois não temos os dois pontos no nome da função.
Por enquanto é isso, até mais…