lua中的类与继承

lua没有面向对象一说,但是,我们可以使用table中的元表来实现面向对象的继承机制。
父类实现:

local People = {
    name = ''
}

function People:say()
    print('people '  .. self.name)
end

function People:new(name)
    local o = {name = name}
    setmetatable(o, {__index = self})

    return o
end

看的出来,父类就是简单的一个table,包含了一个new方法实例化自己,在new方法中,最重要的是People将自己作为了自己__index元方法的。回顾一下,在lua中,__index元方法主要作用在查找table表元素时调用,如果一个key未在raw表中找到,则会到__index中去找,在父类中,__index设为自己,则表示当查找People类key时,只会在自己表中查找。接下来,看子类代码:

local Teacher = {
}
function Teacher:sayup()
    print('teacher ' .. self.name)
end
setmetatable(Teacher, {__index = People})

在这个,定义了一个Teacher类,它的__index设为了People,也就是说,当在Teacher中查找一个key时未找到,则会到People类中去找,也就是说,Teacher类继承了People类的属性和方法。
测试:

local xiaohua = People:new('xiaohua')
xiaohua:say() 
local xiaoming = Teacher:new('xiaoming')
xiaoming:say() 
xiaoming:sayup() --打印出 teacher xiaoming

以上案例可以测试lua中的继承,总结:利用lua中元表__index可以模拟实现面向对象中的继承机制。

你可能感兴趣的:(lua)