class 函数:
function class(members, methods)
local temp = members.public
local __private_members__ = members.private
local __methods__ = methods
local function indexFunc(t, k)
if __methods__[k] then
return __methods__[k]
elseif __private_members__[k] then
local msg = string.format( "warning : try to access private member [%s]", tostring(k))
print(msg)
else
local msg = sttring.format("warning : not a member or method [%s]", tostring(k))
print(msg)
end
end
local function newIndexFunc(t, k, v)
if __private_members__[k] == nil then
local msg = string.format("warning : invalid member [%s]", tostring(k))
print(msg)
elseif v == nil then
local msg = "warning : invalid value -> nil"
print(msg)
else
local msg = string.format("warning : try to change private member [%s]", tostring(k))
print(msg)
end
end
local mt = {
__index = indexFunc,
__newindex =newIndexFunc
}
setmetatable(temp, mt)
if not __methods__.ctor then
__methods__.ctor = function()
print("default ctor")
end
end
temp.ctor()
return temp
end
Usage:
local members = {
private = {
_name_ = "巴啦啦能量",
_age_ = 12
},
public = {
_sex_ = "male"
}
}
local methods = { }
function methods:ctor()
members.private._name_ = "让我来朵蜜你吧"
members.private._age_ = 23
end
function methods:setName(name)
members.private._name_ = name
end
function methods:getName()
return members.private._name_
end
function methods:setAge(age)
members.private._age_ = age
end
function methods:getAge()
return members.private._age_
end
function methods:setSex(sex)
members.public._sex_ = sex
end
function methods:getSex()
return members.public._sex_
end
local student = class(members, methods)
if student then
local name1 = student:getName()
local age1 = student:getAge()
local sex1 = student:getSex()
print(name1, age1, sex1)
student:setName("巴啦啦能量")
student:setAge("12")
student:setSex("female")
local name2 = student:getName()
local age2 = student:getAge()
local sex2 = student:getSex()
print(name2, age2, sex2)
student._name_ = "你们不要打啦"
student._age_ = "19"
student._sex_ = "unknown"
local name3 = student._name_
local age3 = student._age_
local sex3 = student._sex_
print(name3, age3, sex3)
end
output
让我来朵蜜你吧 23 male
巴啦啦能量 12 female
warning : try to change private member [_name_]
warning : try to change private member [_age_]
warning : try to access private member [_name_]
warning : try to access private member [_age_]
unknown
PS
1.支持面向对象
2.支持访问权限控制
3.必须在 local members = { } 中初始化成员,否则未初始化成员声明无效
4.本文为一个lua实现OOP的思路,如有遗漏的地方,欢迎大家留言
网友评论