欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lua学习记录-3

程序员文章站 2022-03-14 11:01:01
...

Lua 学习记录-3

实现继承(元表)

  1. Lua中实现模拟对象的原理是利用table,如果要实现继承或者多继承,那么就得仰仗table的特性-元方法

  2. 元方法中用的比较多的是__index 元方法,当你通过键来访问 table 的时候,如果这个键没有值,那么Lua

  3. 继承的实现原理是setmetatable() + __index元表,

     mytable = {}                          -- 普通表 
     mymetatable = {}                      -- 元表
     setmetatable(mytable,mymetatable)     -- 把 mymetatable 设为 mytable 的元表 
    

继承与多继承就是让__index能遍历多个表找出正确表对应的元素。(可以将通用的代码设置到Live Templates中)

local function super(key, list)
    for i, v in ipairs(list) do
        local table = list[i];
        local var = table[key]
        if var then
            return var;
        end
    end
    return nil;
end

--Base Class
local Father = {};
Father.grandFather = "Unknown";
Father.grandAge = 0;
Father.address = "Unknown";

function Father:setFatherMessage(m_father, m_age, m_address)
    self.grandFather = m_father;
    self.grandAge = m_age;
    self.address = m_address;
end

function Father:getFatherMessage()
    print("姓名 : " .. self.grandFather, "年龄 : " .. self.grandAge)
end

function Father.jump()
    print("Father跳起来了")
end

--Sub class
local GrandSon = {};
GrandSon.say = "I have a dream"

--当__index指向的是函数时,
function createGrandSon()
    local grandson_obj = {};
    local baseClass = { GrandSon, Father };	--要继承的类
    setmetatable(grandson_obj, {
        __index = function(t, k)			--function(t,k)为lua解释器机制,k为属性名或方法名
            return super(k, baseClass); 	--默认有两个参数,第一个为table,第二个为要查找的key
        end
    });
    return grandson_obj;
end

local a = createGrandSon()
a.jump()
a:getFatherMessage()
print(a.say)
相关标签: Lua