クラスを定義する関数

クラスを定義するヘルパ関数です。
単一継承できます。

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