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