Lua中实现面向对象用的是元表的机制,元表与表是不同的个体,创建table时,不会自动创建元表。不过任何的表都可以有元表。
setmetatable(table1,table2):table2会做为table1的元表,同时有一个返回值table1.
__index方法,这个是元表中的元方法,它有回溯的功能,可以查找table中的属性,找不到相关属性会返回nil.找到就会返回相应的值。
__index的值可以是一个方法,也可以是一个表,表又可能具有表有的特性。
写下实现面向对象的思路:
首先是类的特点,继承。
我们可以先定义一个父类Parent
Parent = {
x = 10,
y = 20
}
function Parent( t )
{
local t = t or {}
self.__index = self
setmetatable( t, self )
return tend
}
Parent有两个属性,new方法是实例出一个对象,这个对象同时也是个类,为什么呢?我们分析一下:
1.把元方法指向自己
self.__index = self
2.设置元表也是自身
setmetatable( t, self )
3.最后返回这个对象
return t
我们可以先试验证一下
Child = Parent:new()
print(Child.x)
--10
我们得到一个对象Child,Child访问变量x,在自身找不到变量,Child就会去元表里查找有没有值,找到就会去找元方法的引用,此时到达Parent,Parent里有x,就返回x的值,但是Child里是没有x,系统就会构造一个变量来接收Parent的x,这样Child自身虽然没有x这个变量,但是他还是能通过元表与元方法得到Parent的x值,这不正是继承了吗?
同时,Child也是一个类,因为在new的时候,Child也返回了一个指向身的原型,所以Child也有Parent的功能,所以我们可以这样访问:
Child2 = Child2.new()
print(Child2.x)
--10
这样我们就能实现一条长长的继承链
我们还可以在子类覆盖父类的方法与成员变量,也就是重载,这个其实很简单了,我们已经实现继承就好办了直接上代码:
Child2 = Child2.new()
self.x = 20
print(Child2.x)
--20
直接更改赋值就行。
Lua的灵活与强大难以致信,对Lua的学习还要加油!!
网友评论