Luaのオブジェクト向け実装方式

2251 ワード

1、簡単な例を見て
function create(name, id)
 	local obj = { name = name, id = id }
 	function obj:SetName(name)
 		self.name = name
 	end
 	function obj:GetName()
 		return self.name
 	end
 	function obj:SetId(id)
 		self.id = id
 	end
 	function obj:GetId()
		return self.id
 	end
 return obj
end

o1 = create("Sam", 001)
print("o1's name:", o1:GetName(), "o1's id:", o1:GetId())
o1:SetId(100)
o1:SetName("Lucy")
print("o1's name:", o1:GetName(), "o1's id:", o1:GetId())
    :
o1's name: Sam o1's id: 1
o1's name: Lucy o1's id: 100

2、いくつかの実現対象の方式
a、オブジェクトファクトリモード、例えば前のコードのcreate関数
b、オブジェクトを表で表すオブジェクトのデータと方法を1枚の表に入れ、プライベートメンバーは隠されていないが、簡単なスクリプトには完全に受け入れられる.
メンバーメソッドの定義function obj:method(a 1,a 2,...)...endは(コロン)function objに等価である.method(self, a1, a2, ...) … endは(点号)objに等価である.method = function (self, a1, a2, ...) … end
メンバーメソッドの呼び出しobj:method(a 1,a 2,...)はobjに等価である.method(obj, a1, a2, ...)
3、オブジェクトの単純継承
function createRobot(name, id)
 	local obj = { name = name, id = id }
 	function obj:SetName(name)
 		self.name = name
 	end
 	function obj:GetName()
 		return self.name
 	end
 	function obj:GetId()
 		return self.id
 	end
 	return obj
end

function createFootballRobot(name, id, position)
 	local obj = createRobot(name, id)
 	obj.position = "right back"
 	function obj:SetPosition(p)
 		self.position = p
 	end
 	function obj:GetPosition()
 		return self.position
 	end
 	return obj
end

4、関数閉パッケージ
1つの関数とその使用するすべてのupvalueは、1つの関数閉パッケージを構成します.
Upvalue 1つの関数で使用される定義の関数体以外の局所変数(external local variable)は、この関数のupvalueと呼ばれます.
function createCountdownTimer(second)
 	local ms = second * 1000
 	local function countDown()
 		ms = ms - 1
 		return ms
 	end
 	return countDown
end

timer1 = createCountdownTimer(1)
for i = 1, 3 do
 	print(timer1())
end
print("------------")
timer2 = createCountdownTimer(1)
for i = 1, 3 do
 	print(timer2())
end
    :
999
998
997
------------
999
998
997

前のコードでは、関数countDownで使用される定義の関数createCountdownTimerでのローカル変数msがcountDownのupvalueであるが、msはcreateCountdownTimerではupvalueではなくローカル変数である.