【Lua】Lua之面向对象

在上一篇中我们提到在 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,dahuang
function Dog:new(dog)
    -- body
    dog = dog or {}
    setmetatable(dog,self)
    self.__index = self
    return dog
end

function Dog:eat()
    -- body
    print(self.name, "eat something...")
end

function Dog:getName()
    -- body
    return self.name
end

function Dog:setName(name)
    -- body
    self.name =  name
end

d = Dog:new()
d:eat()                             -- 输出: dahuang eat something...
print(d:getName())                  -- 输出: dahuang
d:setName("Hachi")                  -- 八公
print("change name:",d:getName())   -- 输出: Hachi

setmetatable(dog,self)
self.__index = self

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

继承

Husky = Dog:new()

-- Derived class method new
function Husky:new (dog)
  dog = dog or Dog:new(dog)
  setmetatable(dog, self)
  self.__index = self
  return dog
end

function Husky:eat()
    -- body
    print("husky eat meat...")
end

h = Husky:new()
h:eat()                 --输出:husky eat meat...
h:setName("ErHa")
print(h:getName())      --输出:ErHa

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

你可能感兴趣的:(lua)