在菜鸟教程学习lua面向对象时有以下代码
-- Meta class
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
Square = Shape:new()
-- Derived class method new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
在Shape:new的时候返回的是 一个空表o,o的元表是Shape ,把此对象记作A
A的结构:[A]-的元表->Shape
在Square:new的时候:
注意:Square本身就是一个对象A
创建了一个空表(此处记作对象B),然后将A设置为B的元表
那么此时的结构就是 [B(空表)] --的元表--> [A(Square)] --的元表-->[Shape]
所以Square:new的时候创建了一个空表,Square对象的本体是作为空表的元表来存在的,同样Shape也做为Square的元表来存在
根据lua对表元素的访问流程:
1.在目标表中查找key,若有返回该元素则return 否则go2
2.若没有元表则return nil ,否则 go3
3.若元表的__index 为nil 则return nil 否则 go4
4.若__index为方法,则return 否则 go5
5.(此时__index为表)将__index作为目标表从1开始重复
这样就能实现方法的继承与重写了