资源大湿 发表于 2021-7-19 11:20

unity lua实现多继承的几种方法


原理

1. lua的面向对象是基于元表metatable实现的,原理即在一个表中查找不到,就到元表中查找

2. lua的多继承原理即在一个表中查找不到,则到多个表中进行查询

-----------------------------------------   基类BaseClass1    ------------------------------------------
-- 类BaseClass1的声明
BaseClass1 =
{
}-- 构造函数
function BaseClass1:new()
      print("BaseClass1:构造函数")

      -- 新建一个对象,这样通过BaseClass1:new()函数创建的每一个实例都是独立的
      local tempObj = {}

      -- 设置新对象的metatable,谨记:这一步非常重要
      setmetatable(tempObj,{__index = BaseClass1})

      -- 返回这个新创建的对象
      return tempObj
end

-- 类的print()函数
function BaseClass1: Print()
      print("BaseClass1: Print()")
end

-- 类的特有函数Add()
function BaseClass1: Add()
      print("BaseClass1: Add()")
end

-----------------------------------------   基类BaseClass2    ------------------------------------------
-- 类BaseClass2的声明
BaseClass2 =
{
}

-- 构造函数
function BaseClass2:new()
      print("BaseClass2:构造函数")

      -- 新建一个对象,这样通过BaseClass2:new()函数创建的每一个实例都是独立的
      local tempObj = {}

      -- 设置新对象的metatable,谨记:这一步非常重要
      setmetatable(tempObj,{__index = BaseClass2})

      -- 返回这个新创建的对象
      return tempObj
end

-- 类的print()函数
function BaseClass2: Print()
      print("BaseClass2: Print()")
end

-- 类的特有函数Reduce()
function BaseClass2: Reduce()
      print("BaseClass2:Reduce()")
end

-----------------------------------------       搜索函数      ---------------------------------------
-- 非常关键的函数(在table list中查找变量key)
local   function search(key,list)
            for i=1, table.getn(list) do
                local v = list
                if v then
                  return v
                end
            end
      end

-----------------------------------------            子类SubClass    ----------------------------------------
local SubClass =
{
}
function SubClass:new()

      -- 为SubClass设置元表
    localbase = {BaseClass1, BaseClass2}
    setmetatable(SubClass, {__index= function(table,key) return search(key, base) end})

      -- 新建一个子类对象,设置元表为SubClass
      local tempObj = {}
    setmetatable(tempObj, {__index = SubClass})
    return tempObj
end

-- 子类的特有函数
function SubClass:SubPrint()
      print("SubClass:SubPrint()")
end

----------------------------------------    下面是测试代码      -----------------------------------
-- 构造一个子类实例
local SubObj = SubClass:new()

-- 访问子类自己的print()函数,
--由于基类1和基类2里面都有Print()函数,会发现,实际访问的是基类1里面的函数,非常不建议基类中函数/变量名字一样,容易混淆
SubObj: Print()

-- 访问子类自己的SubPrint()函数
SubObj:SubPrint()

-- 访问基类1的特有函数Add()
SubObj:Add()

-- 访问基类2的特有函数Reduce()
SubObj:Reduce()



代码2:
http://my.oschina.net/u/156466/blog/401576
local class1 = {}
function class1:new()
    local obj = {}
    setmetatable(obj, {__index= class1})
    return obj
end

function class1:print1()
    print("class1:print()")
end

function class1:print2()
    print("class1:print()")
end


local class2 = {}
function class2:new()
    local obj = {}
    setmetatable(obj, {__index= class2})
    return obj
end

function class2:print2()
    print("class2:print()")
end


local class3 = {}
function class3:new()
    local obj = {}
    setmetatable(obj, {__index= class3})
    return obj
end

function class3:print2()
    print("class3:print()")
end

function class3:print3()
    print("class3:print()")
end


function super(k, list)
    for i,v in ipairs(list) do
      local ret = v
      if ret then
            return ret
      end
    end
end


local class = {}
function class:new(...)
    local obj = {}
    -- localbase = {class1, class2}
    local base = {...};
    --t为调用的对象,k为方法名
    setmetatable(class, {__index= function(t,k) return super(k, base) end})
    setmetatable(obj, {__index = class})
    return obj
end

local c = class:new(class2,class1,class3);
-- c:print1();
c:print2();
-- c:print3();

页: [1]
查看完整版本: unity lua实现多继承的几种方法