lua対象者向け
11798 ワード
luaは元の表と元の方法で対象向けのプログラミング設計を完成できます.思想はjavascriptと同じです.全部self言語です.
一つ目はクローズド方式で、オブジェクト属性と方法をクローズドにパッケージ化し、オブジェクトを作成する時に属性と方法をコピーすればいいという欠点が明らかになっています.これは疑似共有機構です.オブジェクトを作成する時に、クラスのすべての属性と方法をコピーします.これはこの方法で多すぎるオブジェクトを作成するとメモリが無駄になります.
一つ目はクローズド方式で、オブジェクト属性と方法をクローズドにパッケージ化し、オブジェクトを作成する時に属性と方法をコピーすればいいという欠点が明らかになっています.これは疑似共有機構です.オブジェクトを作成する時に、クラスのすべての属性と方法をコピーします.これはこの方法で多すぎるオブジェクトを作成するとメモリが無駄になります.
local function newStudent()
local student = {}
student.name = ""
student.age = ""
student.sex = ""
student.setName = function(name)
student.name = name
end
student.setAge = function(age)
student.age = age
end
student.setSex = function(sex)
student.sex = sex
end
local meta = {
__index = function(_,k)
local s = string.format("undefind reference to %s",k)
error(s)
end,
__newindex = function(_,k)
local s = string.format("can't assign `%s` property for object",k)
error(s)
end
}
setmetatable(student,meta)
return student
end
local s1 = newStudent()
s1.setName("Marco")
local s2 = newStudent()
s2.setName("Epsilion")
print(s1.name)
print(s2.name)
--print(s1.lalal) --occur error
--s1.hello = "www"
二つ目は、牛に迫るように書く時のコピー技術を採用し、対象を作成する時に共有類(実はテーブル)のデータを作成し、対象を再度訪問する時に対象のinstanceテーブルに属性を作成します.local Student = {name = "",sex = "",age = ""}
function Student:new(t)
t = t or {}
self.__index = self;
local meta = {
__index = function(_,k)
local s = string.format("can't read non-exist property `%s` for class Student instance",k)
error(s)
end
}
self.__newindex = function(t,k,v)
if k == "name" or k == "sex" or k == "age" then
rawset(t,k,v)
return
end
local s = string.format("can't set property `%s` of class Student instance",k)
error(s)
end--
setmetatable(self,meta)
setmetatable(t,self)
return t
end
function Student:setName(name)
self.name = name
end
function Student.setSex(sex)
self.sex = sex
end
function Student.setAge(age)
self.age = age
end
local s1 = Student:new()
s1:setName("Marco")
print(s1.name)
local s2 = Student:new()
print(s2.name)
--print(s1.hello) -- error occur
--s1.nana = "hello"; -- error occur