{"id":1107,"date":"2015-06-04T14:15:36","date_gmt":"2015-06-04T14:15:36","guid":{"rendered":"http:\/\/linguagemprisma.net\/blog\/?p=1107"},"modified":"2015-06-04T14:32:11","modified_gmt":"2015-06-04T14:32:11","slug":"orientacao-a-objetos-simples-e-avancado","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/modo_texto\/orientacao-a-objetos-simples-e-avancado\/","title":{"rendered":"Orienta\u00e7\u00e3o a objetos simples e avan\u00e7ado"},"content":{"rendered":"<p>Orienta\u00e7\u00e3o em objetos \u00e9 um paradigma dif\u00edcil de se introduzir no mundo da programa\u00e7\u00e3o. Atualmente temos diversas linguagens que suportam esse mecanismo como o C++, Python, Ruby etc. Outras que for\u00e7am unicamente esse tipo de programa\u00e7\u00e3o como Java, por exemplo.<\/p>\n<p>Prisma como uma modifica\u00e7\u00e3o do c\u00f3digo original Lua, n\u00e3o tem a orienta\u00e7\u00e3o a objetos nativamente, mas tem os mecanismos necess\u00e1rios para se chegar a ela. Para tanto foi implementada uma biblioteca com a classe primordial para criar as outras e com um m\u00e9todo principal para derivar os objetos.<\/p>\n<p>Pense em poo (programa\u00e7\u00e3o orientada a objetos) como uma organiza\u00e7\u00e3o diferente. As fun\u00e7\u00f5es (como imprima(), leia() tente() convstring() etc) e dados ( como: peso, altura, comprimento, gastos, saldo, pre\u00e7o, cliente_a , cliente_b etc) n\u00e3o ficam avulsas como na programa\u00e7\u00e3o estruturada (blocos de fun\u00e7\u00f5es e estruturas de dados).<br \/>\nMas ficam empacotados em uma \u00fanica vari\u00e1vel chamada classe, da qual podemos declarar novas vari\u00e1veis que automaticamente herdam as fun\u00e7\u00f5es e dados da classe pai.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: left;\"><strong>Bom chega de bl\u00e1 bl\u00e1 bl\u00e1 e vamos programar:<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><strong>Um exemplo bem simples primeiro:<\/strong><\/p>\n<div class=\"codeheader\"><\/div>\n<p><code class=\"\" data-line=\"\">\u00a0<\/code><\/p>\n<pre class=\"lang:prisma decode:true \">\/\/exemplo classe simples:\r\n\/\/importando a lib \"classe\"\r\ninclua'classe';\r\n\r\n\/\/note que a funcao que cria classe \u00e9 inicial maiuscula \"Classe()\";\r\n\r\n\/\/criando uma classe com dados em valores padr\u00f5es:\r\npessoa = Classe{nome = 'nao definido' , idade = 'nao definido' } ; \/\/nova classe chamada 'pessoa'\r\nfuncao pessoa.mostre_dados( este )\r\n\u00a0 \u00a0 \u00a0poe'---------------------------------------------------------------';\r\n\u00a0 \u00a0 \u00a0imprima(este.nome);\r\n\u00a0 \u00a0 \u00a0imprima(este.idade);\r\nfim\r\n\r\n\u00a0\/\/quando usamos dois pontos no m\u00e9todo\r\n\/\/n\u00e3o precisamos passar explicitamente o par\u00e2metro este\r\n\/\/fica subentendido:\r\nfuncao pessoa:denome( nome )\r\n\u00a0 \u00a0 \u00a0este.nome = nome;\r\nfim\r\n\r\nfuncao pessoa:deidade( idade )\r\n\u00a0 \u00a0 este.idade = idade;\r\nfim\r\n\r\nmaria = pessoa:novo{\u00a0 };\r\nmaria:mostre_dados();\r\nmaria:denome('Maria'); \/\/agora damos um nome\r\nmaria:mostre_dados(); \/\/mas idade est\u00e1 nulo ainda\r\n\r\n\/\/criando um novo objeto pessoa com dados \r\n\/\/ j\u00e1 passados\r\njoao = pessoa:novo{ nome = 'Joao' , idade = 28 };\r\njoao:mostre_dados();<\/pre>\n<p>Veja a sa\u00edda (Ubuntu 14.04):<br \/>\n<img decoding=\"async\" class=\"bbc_img\" src=\"http:\/\/www.linguagemprisma.net\/images\/ooSimples.png\" alt=\"\" \/><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><strong>Um mais avan\u00e7ado:<\/strong><\/p>\n<div class=\"codeheader\"><\/div>\n<pre class=\"lang:prisma decode:true \">\/\/Para criarmos classes e depois objetos em Prisma precisamos incluir a biblioteca 'classe':\r\ninclua'classe'; \r\n\r\n\/\/criando uma nova classe chamada conta_bancaria:\r\nconta = Classe{ \r\nnome = '' , \/\/dado nome do usuario da conta\r\nsaldo = 0, \/\/definindo um saldo padr\u00e3o = zero\r\n\r\ndespositar = funcao( este , n )\u00a0 \r\n\u00a0 \u00a0 \u00a0este.saldo = este.saldo + n; \/\/somando o novo deposito ao saldo atual;\r\nfim ;\r\nsacar = funcao( este , n\u00a0 )\r\n\u00a0 \u00a0este.saldo = este.saldo - n ; \/\/subtraindo do saldo atual\r\nfim ;\r\npoupanca = 0 ;\u00a0 \/\/definindo valor da poupanca\r\n\r\ntransf_para_poupanca = funcao(este , n )\r\n\u00a0 \u00a0 \u00a0 \u00a0imprima('\\n' , sis.data() , '\\nDeposito da conta corrente para poupanca, valor: ' , n , '\\n' );\r\n\u00a0 \u00a0 \u00a0este.saldo = este.saldo - n; \/\/tirando da conta corrente\r\n\u00a0 \u00a0 este.poupanca = este.poupanca + n; \/\/colocando na poupanca\r\nfim ;\r\n\r\ntransf_para_conta = funcao ( este , n )\r\n\u00a0 \u00a0imprima('\\n' , sis.data() , '\\nDeposito da poupanca para conta, valor: ' , n , '\\n' );\r\n\u00a0 \u00a0 este.poupanca = este.poupanca - n;\r\n\u00a0 \u00a0 este.saldo = este.saldo + n;\r\nfim\u00a0 ; \/\/nunca se esque\u00e7a de separar por ponto e v\u00edrgula ou v\u00edrgula\r\n\r\nmostre_nome = funcao(este) imprima('\\nNome :' , este.nome, '\\n') fim;\r\nmostre_saldo = funcao( este )\u00a0 imprima( 'Saldo conta corrente :' , este.saldo, '\\n' ) fim ;\r\nmostre_poupanca = funcao( este ) imprima('Poupanca :' , este.poupanca, '\\n' ) fim \r\n\r\n}\r\n\r\n\r\n\/\/feito a classe conta podemos fazer objetos a partir dela como o metodo novo\r\n\r\nconta_padaria = conta:novo({nome = 'Conta padaria'}); \r\n\/\/se preferir pode descartar os par\u00eanteses quando passar uma tabela.\r\nconta_padaria:mostre_nome();\r\nconta_padaria:mostre_saldo();\r\nconta_padaria:mostre_poupanca();\r\n\r\n\/\/voce pode passar uma tabela redefinindo os dados:\r\nconta_pessoal = conta:novo{nome = 'Paulo-conta' , saldo = 250.00 };\r\nconta_pessoal:mostre_nome(); \/\/imprime o nome\r\nconta_pessoal:mostre_saldo(); \/\/imprime o saldo conta corrente\r\nconta_pessoal:mostre_poupanca(); \/\/imprime saldo poupanca\r\nconta_pessoal:despositar( 1000.00 ); \/\/deposita\r\nconta_pessoal:mostre_saldo(); \/\/imprime saldo\r\nconta_pessoal:transf_para_poupanca( 250.00 ); \/\/transfere para poupanca\r\nconta_pessoal:mostre_saldo();\u00a0 \/\/imprime saldo\r\nconta_pessoal:mostre_poupanca(); \/\/imprime poupanca\r\n<\/pre>\n<p>Note que:<\/p>\n<p>*este* \u00e9 uma palavra reservada que simboliza a tabela do pr\u00f3prio objeto passado como par\u00e2metro &#8216;este&#8217;;<br \/>\nS\u00e3o usados dois pontos *:* para acessar um m\u00e9todo de um objeto:\u00a0 \u00a0conta_pessoal:mostre_poupanca();<\/p>\n<p style=\"text-align: center;\"><strong>HERAN\u00c7A<\/strong><\/p>\n<p>Muitas vezes queremos construir uma nova classe, mas n\u00e3o do zero, seria bom pegar os dados e os m\u00e9todos emprestados de uma classe j\u00e1 existente, isso se chama heran\u00e7a, pois\u00a0 a nova classe recebe como base uma antiga e herda seus atributos:<\/p>\n<p>Analise o seguinte c\u00f3digo, uma modifica\u00e7\u00e3o do anterior:<\/p>\n<div class=\"codeheader\"><\/div>\n<pre class=\"lang:prisma decode:true \">\/\/Para criarmos classes e depois objetos em Prisma precisamos incluir a biblioteca 'classe':\r\ninclua'classe'; \r\n\r\n\/\/criando uma nova classe chamada conta_bancaria:\r\nconta = Classe{ \r\nnome = '' , \/\/dado nome do usuario da conta\r\nsaldo = 0, \/\/definindo um saldo padr\u00e3o = zero\r\n\r\ndespositar = funcao( este , n )\u00a0 \r\n\u00a0 \u00a0 \u00a0este.saldo = este.saldo + n; \/\/somando o novo deposito ao saldo atual;\r\nfim ;\r\nsacar = funcao( este , n\u00a0 )\r\n\u00a0 \u00a0este.saldo = este.saldo - n ; \/\/subtraindo do saldo atual\r\nfim ;\r\npoupanca = 0 ;\u00a0 \/\/definindo valor da poupanca\r\n\r\ntransf_para_poupanca = funcao(este , n )\r\n\u00a0 \u00a0 \u00a0 \u00a0imprima('\\n' , sis.data() , '\\nDeposito da conta corrente para poupanca, valor: ' , n , '\\n' );\r\n\u00a0 \u00a0 \u00a0este.saldo = este.saldo - n; \/\/tirando da conta corrente\r\n\u00a0 \u00a0 este.poupanca = este.poupanca + n; \/\/colocando na poupanca\r\nfim ;\r\n\r\ntransf_para_conta = funcao ( este , n )\r\n\u00a0 \u00a0imprima('\\n' , sis.data() , '\\nDeposito da poupanca para conta, valor: ' , n , '\\n' );\r\n\u00a0 \u00a0 este.poupanca = este.poupanca - n;\r\n\u00a0 \u00a0 este.saldo = este.saldo + n;\r\nfim\u00a0 ; \/\/nunca se esque\u00e7a de separar por ponto e v\u00edrgula ou v\u00edrgula\r\n\r\nmostre_nome = funcao(este) imprima('\\nNome :' , este.nome, '\\n') fim;\r\nmostre_saldo = funcao( este )\u00a0 imprima( 'Saldo conta corrente :' , este.saldo, '\\n' ) fim ;\r\nmostre_poupanca = funcao( este ) imprima('Poupanca :' , este.poupanca, '\\n' ) fim \r\n\r\n}\r\n\r\n\r\n\/\/feito a classe conta podemos fazer objetos a partir dela como o metodo novo\r\n\r\nconta_padaria = conta:novo({nome = 'Conta padaria'}); \r\n\/\/se preferir pode descartar os par\u00eanteses quando passar uma tabela.\r\nconta_padaria:mostre_nome();\r\nconta_padaria:mostre_saldo();\r\nconta_padaria:mostre_poupanca();\r\n\r\n\/\/voce pode passar uma tabela redefinindo os dados:\r\nconta_pessoal = conta:novo{nome = 'Paulo-conta' , saldo = 250.00 };\r\nconta_pessoal:mostre_nome(); \/\/imprime o nome\r\nconta_pessoal:mostre_saldo(); \/\/imprime o saldo conta corrente\r\nconta_pessoal:mostre_poupanca(); \/\/imprime saldo poupanca\r\nconta_pessoal:despositar( 1000.00 ); \/\/deposita\r\nconta_pessoal:mostre_saldo(); \/\/imprime saldo\r\nconta_pessoal:transf_para_poupanca( 250.00 ); \/\/transfere para poupanca\r\nconta_pessoal:mostre_saldo();\u00a0 \/\/imprime saldo\r\nconta_pessoal:mostre_poupanca(); \/\/imprime poupanca\r\n\r\n\r\n\/\/podemos criar uma outra classe a partir da classe conta, heranca\r\nconta2 = Classe( conta ); \/\/ao passar a classe conta como parametro\r\n\/\/ a nova classe conta2 tera automaticamente os dados e metodos\r\n\/\/da classe conta; isso se chama heranca\r\n\r\n\/\/adicionando dados e metodos extras que nao existem em conta\r\n\/\/veja que a adicao foi posterior, sem usar chaves, isso n\u00e3o importa:\r\nconta2.numero = 0; \r\nconta2.emprestimo_total = 0;\r\nconta2.emprestimo_restante_pagar = 0;\r\nconta2.emprestimo_parcela = 0;\r\nconta2.emprestimo_num_parcelas = 0;\r\n\r\nconta2.mostre_extrato = funcao(este)\r\n\u00a0 \u00a0imprima'-------------------------------------------------------------';\r\n\u00a0 \u00a0imprima'\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 extrato geral\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ';\r\n\u00a0 \u00a0imprima( 'Titular da conta:' , este.nome , '\\n');\r\n\u00a0 \u00a0imprima('saldo conta:', este.saldo );\r\n\u00a0 \u00a0imprima( 'saldo poupanca:' , este.poupanca );\r\n\u00a0 \u00a0imprima( '\\nEmprestimo:' );\r\n\u00a0 \u00a0imprima( 'Valor total a pagar:' , este.emprestimo_total );\r\n\u00a0 \u00a0imprima(\"Total restante a pagar:\" , este.emprestimo_restante_pagar);\r\n\u00a0 \u00a0imprima('Valor de cada parcela:' , este.emprestimo_parcela );\r\n\u00a0 \u00a0imprima( 'Parcelas restantes:' , este.emprestimo_num_parcelas );\r\nfim\r\n\r\nconta2.emprestar = funcao( este , valor , parcelas )\r\n\r\n\u00a0 \u00a0 \u00a0 este.emprestimo_total = valor + valor * 0.2; \/\/20 por cento do total\r\n\u00a0 \u00a0 \u00a0 este.emprestimo_restante_pagar = este.emprestimo_total;\r\n\u00a0 \u00a0 \u00a0 este.emprestimo_parcela = este.emprestimo_total \/ parcelas; \r\n\u00a0 \u00a0 \u00a0 este.emprestimo_num_parcelas = parcelas;\r\n\r\nfim\r\n\r\nconta2.pagar_emprestimo = funcao ( este )\r\n\u00a0 \u00a0 \u00a0 \u00a0este:sacar( este.emprestimo_parcela );\/\/esta funcao foi herdada de conta.\r\n\u00a0 \u00a0 \u00a0 \u00a0este.emprestimo_restante_pagar\u00a0 =\u00a0 \/\/nao tem problema ir para outra linha\r\n\u00a0 \u00a0 \u00a0 \u00a0este.emprestimo_restante_pagar - este.emprestimo_parcela;\r\n\u00a0 \u00a0 \u00a0 \u00a0\r\n\u00a0 \u00a0 \u00a0 \u00a0este.emprestimo_num_parcelas = este.emprestimo_num_parcelas - 1;\r\n\u00a0 \u00a0 \u00a0 \u00a0\/\/diminuiu uma parcela;\u00a0 \u00a0 \u00a0 \u00a0\r\nfim\r\n\r\n\/\/criando um novo objeto com alguns dados:\r\ncliente10 = conta2:novo( {nome = 'Maria' , numero = 10 , saldo = 12000 } )\r\npoe('------------------------------------------------------');\r\ncliente10:mostre_nome();\r\ncliente10:mostre_saldo();\r\ncliente10:emprestar ( 1000.00 , 12 );\r\ncliente10:mostre_extrato();\r\npoe'\\n------------------------------------------------------------------';\r\npoe'\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0paga 1 parcela\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ';\r\n\r\ncliente10:transf_para_poupanca( 2000.00);\r\ncliente10:pagar_emprestimo();\r\ncliente10:mostre_extrato();\r\ncliente10:pagar_emprestimo();\r\ncliente10:pagar_emprestimo();\r\ncliente10:pagar_emprestimo();\r\ncliente10:pagar_emprestimo();\r\n\r\ncliente10:mostre_extrato();\r\n<\/pre>\n<p>Veja a sa\u00edda, em Ubuntu 14.04:<\/p>\n<p><img decoding=\"async\" class=\"bbc_img\" src=\"http:\/\/www.linguagemprisma.net\/images\/ooPrisma.png\" alt=\"\" \/><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><strong>HERAN\u00c7A M\u00daLTIPLA<\/strong><\/p>\n<p>Herdar dados e m\u00e9todos de v\u00e1rias classes ao mesmo tempo. N\u00e3o h\u00e1 muita diferen\u00e7a do exemplo anterior, basta na hora de criar a nova classe passar quantas classes antigas precisar como par\u00e2metro, veja:<\/p>\n<pre class=\"lang:prisma decode:true \">nova_classe = Classe( \u00a0{meus_novos_atributos...} , classe_antigaA , classeAntigaB , ... );<\/pre>\n<p>Note que para mais de um par\u00e2metro n\u00e3o podemos omitir os par\u00eanteses da fun\u00e7\u00e3o Classe;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>Bom, pessoal, \u00e9 isso a\u00ed, orienta\u00e7\u00e3o a objetos n\u00e3o \u00e9 muito f\u00e1cil, mas merece dedica\u00e7\u00e3o, pois quando se programa assim fica bem organizado.<\/p>\n<p>O exemplo acima \u00e9 sem interface gr\u00e1fica, mas basta adaptar e usar a criatividade com ig que o trabalho ser\u00e1 legal.<\/p>\n<p>\u00c9 poss\u00edvel fazer classes de fun\u00e7\u00f5es gr\u00e1ficas facilmente.<\/p>\n<p>Valeu, obrigado por ler e usar Prisma, qualquer d\u00favida deixe um coment\u00e1rio aqui ou v\u00e1 ao f\u00f3rum <a title=\"F\u00f3rum Prisma\" href=\"http:\/\/linguagemprisma.net\/prisma_forum\/\" target=\"_blank\">clicando &lt;aqui&gt;<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Orienta\u00e7\u00e3o em objetos \u00e9 um paradigma dif\u00edcil de se introduzir no mundo da programa\u00e7\u00e3o. Atualmente temos diversas linguagens que suportam esse mecanismo como o C++, Python, Ruby etc. Outras que for\u00e7am unicamente esse tipo de programa\u00e7\u00e3o como Java, por exemplo. Prisma como uma modifica\u00e7\u00e3o do c\u00f3digo original Lua, n\u00e3o tem a orienta\u00e7\u00e3o a objetos nativamente,&#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-1107","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\/1107","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=1107"}],"version-history":[{"count":6,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1107\/revisions"}],"predecessor-version":[{"id":1113,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1107\/revisions\/1113"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=1107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=1107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=1107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}