Metatable与面向对象、继承
2016-06-23 17:47
344 查看
Lua是个面向过程的语言, 但通过Metatable可以模拟出面向对象的样子. 其关键就在于__index这个域. 他提供了表的索引值入口. 这很像重写C#中的索引器, 当表要索引一个值时如table[key], Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有__index属性的Metatable, 则Lua会按照__index所定义的函数逻辑查找. 仔细想想, 这不正为面向对象中的核心思想继承, 提供了实现方式么. Lua中实现面向对象的方式非常多, 但无论哪种都离不开__index.
local bb = {cancry = true} function bb:new() b = {} self.__index = self--改变自己的索引值入口 setmetatable(b, self)--将b的索引值入口设成self,即(local bb = {cancry = true}) return b end local ostrich = bb:new() print(ostrich.cancry)另外一个教程:
Person={} function Person:new(p) local obj = p if (obj == nil) then obj = {name="ChenHao", age=37, handsome=true} end self.__index = self--是怕self被扩展后改写,所以,让其保持原样 return setmetatable(obj, self)--返回第一个参数 end function Person:toString() return self.name .." : ".. self.age .." : ".. (self.handsome and "handsome" or "ugly") end上面我们可以看到有一个new方法和一个toString的方法。其中:1)self 就是 Person,Person:new(p),相当于Person.new(self, p)2)new方法的self.__index = self 的意图是怕self被扩展后改写,所以,让其保持原样3)setmetatable这个函数返回的是第一个参数的值。于是:我们可以这样调用:
me = Person:new()print(me:toString())kf = Person:new{name="King's fucking", age=70, handsome=false}print(kf:toString())继承:
Student = Person:new()function Student:new()newObj = {year = 2013}self.__index = selfreturn setmetatable(newObj, self)endfunction Student:toString()return "Student : ".. self.year.." : " .. self.nameend
student = Student:new()print(student:toString())
相关文章推荐
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- C#中面向对象编程机制之多态学习笔记
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Python3 面向对象概述
- java面向对象之类和对象