–面向对象编程
–并不是真正的面向对象 脚本语言 lua知识去模拟这种面向对象的额方法
Account =
{
balance= 10
}
function Account.count(self,v )
-- body
self.balance = self.balance + v
print("value is ".. self.balance)
end
tt=Account
tt.count(tt,12)--第一种方法 22
tt:count(12)--第二种方法 34
function Account:mytostring( )--注意看细节
-- body
print("jieguo shi "..self.balance)
end
tt:mytostring()
--在一个myClass.lua文件中书写如下:
--[[
local myClass = {
name = "ls"
}
function myClass:showname( )-- :可以访问到table中的变量
print(self.name)
end
return myClass
]]
--在另一个文件中
local mtt = require("myclass")
mtt:showname()
–继承和多重继承(伪继承)
--继承 setmetatable(a,b)---相当于 a类继承b类
Account = {num =100}
function Account:new( o)
-- body
o = o or {}
setmetatable(o,self)--相当于 o并继承了Account
self.__index = self
return o
end
function Account:show( v )
print(v)
print(self.num) --父中
print(self.bb + v )--自己中
-- body
end
a = Account:new{bb=12}
a:show(1.0)
–多继承(伪)
function search( k,plist )
for i=1,#plist do
local v = plist[i]
if v then
return v
end
end
end
function creatclass( ... )
local c = {}
local parent = {...}
print("1\n")
setmetatable(c,{__index = function ( t,k )
print("2\n")
return search(k,parent)
end})
print("3\n")
c.__index = c;
function c:new( o )
o = o or {}
print("4\n")
setmetatable(o,c)
return o
end
end
--此方法一般不怎么用
–私密性和单一方法
和c++中的类的封装十分相似
function newAccount( initlizedBanlace )
local self = {blance = initlizedBanlace}
local show = function ( v )
self.blance = self.blance-v
end
local getBanlance = function ( )
return self.blance
end
return{
show = show,
getBanlance = getBanlance
}
end
acc = newAccount(200)
print(acc.getBanlance())
acc.show(200)
print(acc.getBanlance())
function newObject( value )
return function ( action,v )
if action == "get" then return value
elseif action == "set" then value = v
else
print("unknown action")
end
end
end
d = newObject(34)
print(d("get"))
d("set",12)
print(d("get"))
d("ded")