【Lua】Lua之面向对象

来源:互联网 发布:读诗书明德知礼下联 编辑:程序博客网 时间:2024/05/08 14:08

在上一篇中我们提到在 Lua 中的一条总结

万物皆值: 函数也是一种值

正式这个特点我们可以使用 table (数组)构建一个包含有属性和方法的 table,这个table 就可以被我们当做对象来使用

metatable

tbl1 = {a = 1}tbl2 = {}setmetatable(tbl2,{__index = tbl1})print(tbl2.a)       --输出1

metastable可以用来改变table的行为,如__index表示查找元素的行为
这里执行 tbl2.a 的时候,由于tbl2没有a这个key对应的value,会到metatable中去查找,metatable中有__index这个key对应的值tbl1,所以最终会到tbl1中去 查找a对应的value,最后得到1。

面向对象

Dog = {name = "dahuang"}        -- hello,dahuangfunction Dog:new(dog)    -- body    dog = dog or {}    setmetatable(dog,self)    self.__index = self    return dogendfunction Dog:eat()    -- body    print(self.name, "eat something...")endfunction Dog:getName()    -- body    return self.nameendfunction Dog:setName(name)    -- body    self.name =  nameendd = Dog:new()d:eat()                             -- 输出: dahuang eat something...print(d:getName())                  -- 输出: dahuangd:setName("Hachi")                  -- 八公print("change name:",d:getName())   -- 输出: Hachi

setmetatable(dog,self)
self.__index = self

这里是为新的对象 dog 设置了 metatable ,改变了__index的行为,即方法体是通过 metatable 来调用的

继承

Husky = Dog:new()-- Derived class method newfunction Husky:new (dog)  dog = dog or Dog:new(dog)  setmetatable(dog, self)  self.__index = self  return dogendfunction Husky:eat()    -- body    print("husky eat meat...")endh = Husky:new()h:eat()                 --输出:husky eat meat...h:setName("ErHa")print(h:getName())      --输出:ErHa

继承一个基类,来扩展派生类的方法,派生类中保留了基类的成员变量和方法,也可以重写覆盖基类中的成员或者方法

原创粉丝点击