Lua面向对象
2016-04-29 17:12
465 查看
lua没有class的概念,但是可以直接继承其他对象
单继承:
多重继承:
以上代码中的createClass可以生成一个新table,里面包含了两个基类中的成员,在最后的新对象NamedAccount中,调用account:getname时,程序会先在account中找,然后在 Named和Account中寻找同名的方法,这样会略微影响效率,也可以用空间换时间的方法修改上面的–设置元方法中的代码:
简单的继承方法:
![](https://img-blog.csdn.net/20160429171139180)
单继承:
base = { a = 1 , funca = function() return " base " end} function base:new(o) local o = o or {} setmetatable(o, self) self.__index = self return o end child_1 = base:new() child_1.funcb = function() return "child1" end child_2 = child_1:new() print(child_2.a .. child_2.funca() .. child_2.funcb()) -->1 base child1
多重继承:
local function search(k, plist) for i = 1, #plist do local v = plist[i][k] if v then return v end end end function createClass(...) local c = {} local parents = {...} --设置元方法 setmetatable(c, {__index = function(t,k) return search(k, parents) end}) --设置元方法 c.__index = c function c:new(o) o = o or {} setmetatable(o, c) return o end return c end Named = {} function Named:getname() return self.name end Account = { name = "Tom" } NamedAccount = createClass(Named, Account) account = NamedAccount:new() print(account:getname())
以上代码中的createClass可以生成一个新table,里面包含了两个基类中的成员,在最后的新对象NamedAccount中,调用account:getname时,程序会先在account中找,然后在 Named和Account中寻找同名的方法,这样会略微影响效率,也可以用空间换时间的方法修改上面的–设置元方法中的代码:
setmetatable(c, {__index = function(t,k) local v = search(k, parents) t[k] = v return v end})
简单的继承方法:
相关文章推荐
- Lua模块处理
- Lua垃圾回收和弱引用
- Lua学习(六)元表和元方法
- Lua_第26章撰写 C 函数的技巧
- Ionic的项目结构(angluar js)
- Lua 5.2/5.3 热更新小结
- 记录lua的table转string一个问题
- 我理解的设计模式:工厂模式
- lua: pcall xpcall debug
- Lua_第25章 调用 C 函数
- C++与Lua5.3.2的相互调用
- Lua 中的string库(字符串函数库)总结
- RobotFrameWork(四)变量运算与Evaluate
- C++调用lua简单的例子
- Lua从入门到放弃--协同程序
- Lua简明教程
- Lua学习(五)函数进阶篇
- Lua学习(四)函数
- 150. Evaluate Reverse Polish Notation
- 150. Evaluate Reverse Polish Notation