Lua Memo

オブジェクト指向について

前提:Lua のオブジェクト指向は Table を用いる。

簡単なサンプル

お手本は以下のような感じで。

MyClass = { value=100 }
function MyClass:new()
	local obj = {}
	setmetatable(obj, self)
	self.__index = self
	return obj
end
function MyClass:showValue()
	print("value="..self.value)
end
function MyClass:setValue(new_value)
	self.value = new_value
end

obj1 = MyClass:new()
obj2 = MyClass:new()
obj1:setValue(200)
obj2:setValue(300)
obj1:showValue() --> value=200
obj2:showValue() --> value=300

ポイント

  • テーブルの要素にアクセスする際には、table.element の形式でアクセスする。
  • 第一引数に自身のオブジェクトを表すメソッドの定義・呼び出しは、table:method() の形式でアクセス可能
  • self で自身を表すことができる

継承

Lua のクラスは、テーブルとメタテーブルを駆使して実現する。よって、new メソッドを下記のように作っておけば、メタテーブルを引き継ぐので、クラスを継承させようと思ったら、普通に XXX:new() のように書けば良い。

-- define MyClass
MyClass = { value=100 }
function MyClass:new(o)
	o = o or {}
	setmetatable(o, self)
	self.__index = self
	return o
end
function MyClass:showValue()
	print("MyClass.value="..self.value)
end
function MyClass:setValue(new_value)
	self.value = new_value
end

-- define MyClassEx
MyClassEx = MyClass:new()
function MyClassEx:showValue()
	print("MyClassEx.value="..self.value)
end

-- use MyClassEx
obj1 = MyClassEx:new()
obj1:setValue(500)
obj1:showValue() --> MyClassEx.value=500

クラス定義のテンプレート

テーブルの初期化を利用してクラスを定義できる

-- define MyClass
MyClass = {
	-- variable
	var1 = 100,
	var2 = 200,
	-- method
	new = function (self, o)
		o = o or {}
		setmetatable(o, self)
		self.__index = self
		return o
	end,
	show = function (self, o)
		print("MyClass.value="..self.var1)
	end,
	setVar1 = function(self, v)
		self.var1 = v
	end
}

obj = MyClass:new()
obj:show() --> MyClass.value=100
obj:setVar1(300)
obj:show() --> MyClass.value=300