找回密码
 立即注册
查看: 224|回复: 0

[简易教程] unity lua实现多继承的几种方法

[复制链接]
发表于 2021-7-19 11:20 | 显示全部楼层 |阅读模式

原理

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[key]
                if v then
                    return v
                end
            end
        end

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

        -- 为SubClass设置元表
    local  base = {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:
  1. http://my.oschina.net/u/156466/blog/401576
  2. local class1 = {}
  3. function class1:new()
  4.     local obj = {}
  5.     setmetatable(obj, {__index= class1})
  6.     return obj
  7. end

  8. function class1:print1()
  9.     print("class1:print()")
  10. end

  11. function class1:print2()
  12.     print("class1:print()")
  13. end


  14. local class2 = {}
  15. function class2:new()
  16.     local obj = {}
  17.     setmetatable(obj, {__index= class2})
  18.     return obj
  19. end

  20. function class2:print2()
  21.     print("class2:print()")
  22. end


  23. local class3 = {}
  24. function class3:new()
  25.     local obj = {}
  26.     setmetatable(obj, {__index= class3})
  27.     return obj
  28. end

  29. function class3:print2()
  30.     print("class3:print()")
  31. end

  32. function class3:print3()
  33.     print("class3:print()")
  34. end


  35. function super(k, list)
  36.     for i,v in ipairs(list) do
  37.         local ret = v[k]
  38.         if ret then
  39.             return ret
  40.         end
  41.     end
  42. end


  43. local class = {}
  44. function class:new(...)
  45.     local obj = {}
  46.     -- local  base = {class1, class2}
  47.     local base = {...};
  48.     --t为调用的对象,k为方法名
  49.     setmetatable(class, {__index= function(t,k) return super(k, base) end})
  50.     setmetatable(obj, {__index = class})
  51.     return obj
  52. end

  53. local c = class:new(class2,class1,class3);
  54. -- c:print1();
  55. c:print2();
  56. -- c:print3();
复制代码


懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-20 05:50 , Processed in 0.093195 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表