{"id":3027,"date":"2017-05-20T15:41:46","date_gmt":"2017-05-20T19:41:46","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=3027"},"modified":"2017-05-20T15:41:46","modified_gmt":"2017-05-20T19:41:46","slug":"atualizacao-da-biblioteca-de-classes-objeto","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/modo_texto\/atualizacao-da-biblioteca-de-classes-objeto\/","title":{"rendered":"Atualiza\u00e7\u00e3o da biblioteca de Classes (objeto)"},"content":{"rendered":"<p>Fiz uma modifica\u00e7\u00e3o na biblioteca de Classes (orienta\u00e7\u00e3o a objetos) e adicionei uma fun\u00e7\u00e3o que permite inclus\u00e3o de um construtor para personalizar a cria\u00e7\u00e3o de novos objetos.<\/p>\n<p>N\u00e3o se preocupe, h\u00e1 compatibilidade total com a vers\u00e3o anterior.<\/p>\n<p>Antes se instanciava um novo objeto de uma classe unicamente com o m\u00e9todo:<\/p>\n<pre class=\"lang:prisma decode:true\">:novo();<\/pre>\n<p>Agora \u00e9 poss\u00edvel criar a pr\u00f3pria fun\u00e7\u00e3o construtora, executando a tabela como se fosse uma fun\u00e7\u00e3o, veja:<\/p>\n<pre class=\"lang:prisma decode:true\">inclua'classe'   \/\/nome da lib \u00e9 com letra minuscula\r\n\r\n\/\/classe cliente:\r\ncliente = Classe{\/\/Nome da funcao \u00e9 iniciada com maiuscula.\r\n nome='Sem Nome' \/\/valor padrao\r\n ; \/\/n\u00e3o se esque\u00e7a de separar cada dado com ponto-e-v\u00edrgula ou v\u00edrgula\r\n tel='000000000000000' \/\/valor padrao\r\n ; \r\n}\r\n\/\/funcao construtora\r\nfuncao cliente:construtor(nome,tel)\r\n este.nome=nome;\r\n este.tel=tel;\r\nfim\r\n\/\/outros m\u00e9todos:\r\nfuncao cliente:mostre()\r\n imprima('Cliente:',este.nome, 'Tel:', este.tel);\r\nfim\r\n\r\nfuncao cliente:def_nome(nome)\r\n este.nome=nome;\r\nfim\r\nfuncao cliente:def_tel(tel)\r\n este.tel=tel;\r\nfim\r\n\/\/------------------------- FIM CLASSE CLIENTE ----------;\r\n\r\n\/\/agora vc pode chamar a tabela como se fosse uma funcao\r\n\/\/e ser\u00e1 chamada a funcao construtor automaticamente, veja:\r\n\r\n\/\/criando um objeto cliente\r\ncliente1 = cliente('Mario','65 9 9999-9999');\r\ncliente1:mostre();\r\ncliente1:def_nome('Mario Alfonso');\r\ncliente1:mostre();\/\/mostra a alteracao;\r\n\/\/instanciando outro objeto\r\ncliente2 = cliente();\r\ncliente2-&gt;def_tel('66 9 9988-9999');\r\ncliente2:def_nome('JOAO APARECIDO');\r\ncliente2-&gt;mostre();\r\n\r\n\/\/se quiser use o metodo antigo sem problemas.\r\ncliente3 = cliente:novo{nome='JESSICA',tel='65 9 9000-000'}\r\ncliente3:mostre();\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Esta nova biblioteca classe.pris estar\u00e1 dispon\u00edvel em nova vers\u00e3o prisma.<\/p>\n<p>Se voc\u00ea gostaria de usar copie o c\u00f3digo abaixo e salve como classe.pris (sem compilar mesmo) no diret\u00f3rio padr\u00e3o Prisma, ou na pasta onde est\u00e1 o programa que ir\u00e1 us\u00e1-la.<\/p>\n<p>(No Linux \u00e9: \u00a0\/usr\/local\/share\/prisma\/1.0\/plib\/<\/p>\n<p>No Windows \u00e9: C:\\\\Prisma\\\\1.0\\\\bin\\\\plibs\\\\ )<\/p>\n<p>Segue o c\u00f3digo:<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/implementa\u00e7\u00e3o de classes com multiplas heran\u00e7as\r\n\/\/convertido para prismabr\r\n\/\/a partir do manual programming in lua 3ed.\r\n\r\n\r\nlocal funcao search ( k , plist )\r\n     para i = 1 , #plist inicio\r\n         local v = plist[i][k]\r\n         se v entao retorne v fim\r\n     fim\r\nfim \/\/fim funcao search\r\n\r\nfuncao Classe(...)\r\n    local c = {} ; \/\/nova classe\r\n    local parents = { ... };\r\n    \r\n    funcao c:novo ( o )\r\n        o = o ou {}\r\n        defmetatabela( o , c );\r\n        retorne o \r\n    fim\r\n    \r\n    defmetatabela ( c , { __index = funcao( t , k )\r\n       retorne search ( k , parents )\r\n       fim;\r\n       __call = funcao(este,...) \r\n                  local obj = este:novo();\r\n                  obj:construtor(...);\r\n                  retorne obj;\r\n               fim}  ) ;\/\/fim defmetatabela\r\n \r\n    c.__index = c;\r\n         \r\n   retorne c;\r\nfim \r\n<\/pre>\n<p>Observe que eu pesquisei no livro Programming in Lua para conseguir trazer esta funcionalidade para Prisma.<\/p>\n<p>Sempre que puder, vou reaproveitar c\u00f3digos j\u00e1 existentes em Lua, afinal, para que reinventar a roda se ela j\u00e1 existe.<\/p>\n<p>Em alguns casos, devido \u00e0 licen\u00e7a ou complexidade, irei eu mesmo fazer a biblioteca se necess\u00e1rio, como j\u00e1 fiz antes (igpbr.so, psqlite3, entre outras);<\/p>\n<p>Note que nos exemplos usei dois pontos (:) para acessar os m\u00e9todos, ou h\u00edfen e maior que (-&gt;), tanto faz, use a forma que preferir, obj-&gt;mostre ou obj:mostre();<\/p>\n<p>\u00c9 necess\u00e1rio usar esses sinais quando se quer passar o pr\u00f3prio objeto automaticamente como par\u00e2metro especial &#8216;este&#8217;;<\/p>\n<p>*** Se preferir pode criar os m\u00e9todos de uma classe na pr\u00f3pria classe e n\u00e3o depois como no exemplo:<\/p>\n<pre class=\"lang:prisma decode:true \">inclua'classe'\r\n\r\nretangulo = Classe{\r\n alt = 10 \/\/altura padrao\r\n ;\r\n larg = 40 \/\/larg padrao\r\n ;  \r\n \/\/metodo construtor:\r\n construtor = funcao(este,alt,larg)\r\n  este.alt=alt;\r\n  este.larg=larg;\r\n fim\r\n ;\r\n\r\n}\/\/fim Classe<\/pre>\n<p>A diferen\u00e7a quando se declara uma fun\u00e7\u00e3o dentro de uma tabela \u00e9 que devemos fazer como se estiv\u00e9ssemos declarando uma vari\u00e1vel qualquer:<\/p>\n<p><strong>nome_func = funcao(este) &#8230; fim<\/strong><\/p>\n<p>E devemos, tamb\u00e9m, passar o par\u00e2metro este explicitamente, pois n\u00e3o temos os dois pontos no nome da fun\u00e7\u00e3o.<\/p>\n<p>Por enquanto \u00e9 isso, at\u00e9 mais&#8230;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fiz uma modifica\u00e7\u00e3o na biblioteca de Classes (orienta\u00e7\u00e3o a objetos) e adicionei uma fun\u00e7\u00e3o que permite inclus\u00e3o de um construtor para personalizar a cria\u00e7\u00e3o de novos objetos. N\u00e3o se preocupe, h\u00e1 compatibilidade total com a vers\u00e3o anterior. Antes se instanciava um novo objeto de uma classe unicamente com o m\u00e9todo: :novo(); Agora \u00e9 poss\u00edvel criar&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,7],"tags":[],"class_list":["post-3027","post","type-post","status-publish","format-standard","hentry","category-modo_texto","category-prisma"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=3027"}],"version-history":[{"count":1,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3027\/revisions"}],"predecessor-version":[{"id":3028,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3027\/revisions\/3028"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=3027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=3027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=3027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}