Ir para conteúdo

Tutorial SPOO Lua.


Poccnn

Posts Recomendados

Fala Xtibianos.
Vim passar um pouco do que aprendi como programar usando SPOO lua. 


SPOO > Simulação de programação orientada a objeto. 

Lua, não é uma linguagem orientada a objeto, ela apenas simula isso. 

 

Vamos ao que interessa

Para criar um objeto, primeiro cria-se uma estrutura: 
 

Citar

_veiculo = {} -- estrutura (tabela); estou usando uma variavel apenas para dar um nome a essa estrutura. 

 

A estrutura pode ter valores inseridos nela. 

Citar

_veiculo.nome = "sem nome" 
_veiculo.cor = "sem cor" 

 

Agora vamos criar metodos (function) para manipular os valores dentro da estrutura. 

Citar

 

function _veiculo:getName() 
   return self.nome 
end 

function _veiculo:setName(name) 
   self.nome = name 
end 

function _veiculo:getCor() 
   return self.cor 
end 

function _veiculo:setCor(cor) 
   self.cor = cor 
end 

 

 

Agora voce pode usar os metodos para manipular os dados 

Citar

 

_veiculo:setName('poccnn') 
_veiculo:setCor('preto') 

print(_veiculo:getName(),_veiculo:getCor()) 
Saida gerada por esse codigo >> poccnn, preto 

 

 

Mas há um problema, só existe um objeto para ser manipulado; e se eu quiser maanipular mais obejtos do mesmo tipo? 

para isso, lua dispõe de uma função que cria uma metatabela, ou seja, uma tabela que contem os dados originais dessa tabela e mais algumas peculiaridades proprias desse sistema. 

 

Se voce quiser se aprofundar em saber como funciona a herança em spoo lua, veja esse tutorial.

Para criar um novo objeto; vamos criar um metodo que faça isso usando a função setmetatable: 

setmetatable(table,metatable) 

 

Citar

 

function _veiculo:newObjeto(obj) 
   obj.__index = _veiculo -- determinação de indice; mesmo tendo como padrao de indice o proprio objeto, ao ser passado como valor, fica requisitado que seja declarado o indice para o mesmo. 
   return setmetatable({},obj) -- usei uma tabela vazia. 
end 

 

Dois objetos criados com esse metodo.

Citar

local opala = _veiculo:newObjeto(_veiculo) 
local fusca = _veiculo:newObjeto(_veiculo) 

 

 

 dessa forma, esse novo objeto que foi criado e atribuido as variaveis de nomes opala e fusca, pode usar os metametodos já criados para o objeto principal (_veiculo). 

 

Citar

opala:setName('opala') 
opala:setCor('preto') 
fusca:setName('fusca') 
print(opala:getName(),opala:getCor()) 
print(fusca:getName(),fusca:getCor()) 

 

Saida gerada por esse codigo >> 
   opala,   preto 
   fusca,   sem cor 

 

 

Veja que a cor não foi definida para o objeto fusca, então ele retorna o valor padrão que foi declarado na estrutura principal >> _veiculo.cor = "sem cor". 

 

Lua dispõe de varios elementos (variaveis) chaves para manipulação de metatabelas; aqui vou comentar sobre algumas delas: 

Citar

 

__index >> voce declara qual o indice que o sistema vai procurar os valores declarados para o objeto utilizar. 
__metatable >> voce determina qual o objeto que será retornado quando for chamado pela função getmetatable(object). 
__call >> toda vez que usa um metodo no objeto, esse elemento é chamado e aparti dai voce pode determinar o que vai fazer essa chamada. 
__newindex >> declara um novo caminho para inserção de dados ou chamadas de dados. 
__tostring >> caso voce queira imprimir os dados de um objeto, esse elemento sera chamado para obter a string para ser imprimida. 

eu não vou comentar os demais elementos, devido minha ignorancia dos mesmo. 

 

 

Agora vamos por em pratica esses elementos para entendermos melhor seu funcionamento: 


Usando o parametro __index 
ao ser declarado o indice, é usado os valores apontado pelo mesmo. 
 

Citar

local novoCarro = setmetatable(_veiculo,{__index = _veiculo}) 
print(novoCarro:getName(),novoCarro:getCor()) -- usando os metametodos declarados em _veiculo.

 


Usando o parametro __metatable 
Usando esse parametro, voce apenas declara qual sera o objeto retornado. 
 

Citar

 

local corcel = setmetatable({},{__index = _veiculo, __metatable = opala}) --determinei que a metatabela seja o objeto opala descrito acima 
corcel:setName('corcel') -- nesse novo objeto criado, marquei o nome dele como corcel. 
print(getmetatable(corcel):getName()) -- ao ser chamado o objeto, ele retorna o objeto opala, por isso o nome pego, veio do objeto opala e nao desse novo objeto criado acima. 

Saida gerada por esse codigo >> opala. 


Usando o parametro __call 
Toda a chamada que for feita a esse objeto, pode ser processada usando o parametro call. 
 

Citar

 

function _veiculo:getNameByobjName(name) 
   setmetatable({},_veiculo) 
   self.__index = _veiculo 
   self.__call = function(self,value) 
   local lfor = value == 'opala' and opala or value == 'fusca' and fusca or _veiculo 
      if(lfor:getName() == "sem nome")then 
         return "Insira um nome no veiculo..." 
      else 
         return lfor:getName() 
      end 
   end 
   return self.__call(self,name) 
end 
print(corcel:getNameByobjName('opala'),corcel:getNameByobjName('fusca'),corcel:getNameByobjName('monza')) 

 

Saida gerada por esse codigo >> 
opala 
fusca 
Insira um nome no veiculo... 

 


Usando o parametro __newindex

Ao usar esse parametro, voce declara para onde vai ou onde vai buscar os valores do objeto.

 

Citar

 

local impala = setmetatable({},{__index = _veiculo, __newindex = opala}) 
-- todos os elementos declarados para esse objeto impala, não ficam nesse objeto e sim, vão para o objeto declarado em __newindex. 

 

impala.combustivel = "gasolina" -- declarado uma varivel. 
function impala:setPower(power) -- declarado novos metametodos. 
   self.power = power 
end 

function impala:getPower() 
   return self.power 
end 

opala:setPower(200) -- somente o objeto declarado em __newindex é que pode se fazer do uso dos elementos adicionados. 

print(opala.combustivel,opala:getPower()) -- pegando os elementos dentro do objeto opala. 

 

Saida gerado por esse codigo >> gasolina,   200 

 

 

E por ultimo o elemento __tostring 
__tostring serve como elemento para receber uma string para outros fins que não sejam metametodos. 
 

Citar

 

local marverick = setmetatable({},{__index = _veiculo, __tostring = function() return "Essa é uma super-maquina!!!" end}) 
print(marverick) 

 

Saida gerada por esse codigo >> Essa é uma super-maquina!!! 

 

 

Bem é isso pessoal espero que tenham entendido. 

Me corrijam caso tenha errado algo.

Editado por Poccnn
Inserção de informações/formatação
Link para o comentário
Compartilhar em outros sites

  • Poccnn pinned this tópico
  • 1 month later...
×
×
  • Criar Novo...