AKever

导航

Lua的多重继承

Lua的多重继继承

code继承的实现

local function search (k, plist)
    for kk, vv in pairs(plist) do
        local v = vv[k]     -- try `i'-th superclass
          if v then 
              return v 
          end
     end
end

function createClass (p)
    local c = {}        -- new class
    c.super = p;     --保留父类,以便可以重用父类的方法
    --将当前类的索引知道超类上,本地找不到,向上追溯
    setmetatable(c, {__index = function (t, k)
        local v = search(k, p);
        t[k] = v;
        return v;
    end})

    -- prepare 'c' to be the metatable of its instances
     c.__index = c

     -- define a new constructor for this new class
     function c:new (o)
          o = o or {}
          setmetatable(o, c)
          o:init();
          return o
     end     

     return c
end

2.生成一个新类 和 生成一个新对象

--生成一个新类
c1 = createClass({})

--下面是c1的方法
--在这里初始化c1的属性,这些是每个对象不同的属性
function c1:init()
     self.a = 100;
     self.b = {a = 100};
end

function c1:method(a, b)
     print('c1:method(a, b)');
     print('a + b = ', a + b);
     print('self=', tostring(self));
     return a + b;
end

--静态table属性值,所有对象公用
c1.names = {12, 3, 4, 5, 6};

--生成对象
o1 = c1:new()

2.继承举例

c2 = createClass({c1 = c1});

function c2:method(a, b)
     print('c2:method(a, b)');
     return self.super.c1.method(self, a, b); --调用父类的方法,注意,需要传递self参数
end
--创建c2对象o2
o2 = c2:new()

3.多重继承

c3 = createClass({c1=c1, c2=c2})

function c3:method(a, b)
 print('c3:method(a, b)');
 self.super.c1.method(self, a, b);
 self.super.c2.method(self, a, b);
end

o3 = c3:new();

 

posted on 2014-08-05 15:11  AKever  阅读(454)  评论(0)    收藏  举报