クラスを定義する関数
クラスを定義するヘルパ関数です。
単一継承できます。
function define_class(p) local t = {} local pi = p and p.__index or nil -- parent's __index. local ti -- new table's __index. if type(pi) == 'table' then ti = function(u, i) local v = rawget(t, i) return v and v or pi[i] end elseif type(pi) == 'function' then ti = function(u, i) local v = rawget(t, i) return v and v or pi(u, i) end else ti = t -- No parent. end t.__index = ti return t end
使い方:
-- SuperKlass クラスの定義 SuperKlass = SuperKlass or define_class() function SuperKlass.new(x, y) return setmetatable({ x=x, y=y }, SuperKlass) end function SuperKlass:foo() print('foo!', self.x) end function SuperKlass:bar() print('bar!', self.y) end -- SubKlass クラスの定義 SubKlass = SubKlass or define_class(SuperKlass) -- SuperKlass を継承する function SubKlass.new(x, y, z) local self = SuperKlass.new(x, y) self.z = z return setmetatable(self, SubKlass) end function SubKlass:foo() print('overridden foo!', self.z) end