luaのクラスその2

前回のluaのクラスを修正して少し拡張してみた。
rootクラスを定義して、super()で上に辿れるようになった。

-- root class
g_root_class={
  classname="#root#",

  class=function(self)
    return getmetatable(self)
  end,
 
  super=function(class)
    return getmetatable(class).__index
  end,
}
g_root_class.__index=g_root_class

-- define new class
function define_class(name, base_table)
  -- new class
  local class_table={
    classname=name,
    __tostring=function(self)
      return string.format("<class: %s>", name)
    end
  }
  class_table.__index=class_table

  -- extend
  base_table=base_table or g_root_class
  setmetatable(class_table, base_table)

  -- constructor
  class_table.new=function(...)
    local instance={}
    setmetatable(instance, class_table)
    if instance.initialize then
      instance:initialize(...)
    end
    return instance
  end

  -- set global
  _G[name]=class_table
end

--------------------------------------------------------------------------------
define_class("Base")
function Base:initialize()
  print("Base", self)
end

--------------------------------------------------------------------------------
define_class("Extend", Base)
function Extend:initialize()
  print("Extend", self)
  self:class():super().initialize(self)
end

--------------------------------------------------------------------------------
e=Extend:new()