luaのクラスその4
多重継承。
「Programming Lua」の16章を参考。
-------------------------------------------------------------------------------- -- class utility -------------------------------------------------------------------------------- -- root class local g_root_class={ classname="#root#", class=function(self) return getmetatable(self).__index end, } local function g_factory(class, ...) local instance={} setmetatable(instance, class) if instance.initialize then instance:initialize(...) end return instance end -- define new class function define_class(name, ...) local base_table={...} if #base_table==0 then base_table={g_root_class} end -- new class local class_table={ classname=name, super=#base_table==1 and base_table[1] or base_table, __tostring=function(self) return string.format("<instance of: %s>", name) end, } class_table.__index=class_table -- extend setmetatable(class_table, { __index=#base_table==1 and base_table[1] or function(t, k) for i=1, #base_table do local v=base_table[i][k] if v then -- cache t[k]=v return v end end end, __call=g_factory, __tostring=function(self) return string.format("<class: %s>", name) end, }) --set global --global(name) _G[name]=class_table end -- 使う define_class("ClassA") define_class("ClassB") -- ClassAとClassBを多重継承 -- indexが被ったら先に継承した方(ClassA)が使われる define_class("ClassAB", ClassA, ClassB) local ab=ClassAB()
luaunit導入のためあるクラスの機能を分離したかったのだが、
元の変更を最小限にするために多重継承を入れてしまった。
今まで多重継承はできるだけ避けていたのだがどうなんだろう。