オブジェクト指向について
前提: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
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