Lua实现继承
Lua继承使用元表的__index实现。
参考菜鸟教程网站
Shape = {}
--new创建对象
function Shape:new(side)
o = {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
function Shape:printArea()
print("面积为 "..self.area)
end
myshape = Shape:new(10)
myshape:printArea()
Square = Shape:new() --一直不明白这里为什么用new???
-- 派生类方法 new
function Square:new(side)
o = Shape:new(side)
setmetatable(o, self)
self.__index = self
return o
end
-- 派生类方法 printArea
function Square:printArea()
print("正方形面积为 ",self.area)
end
mysquare = Square:new(5)
mysquare:printArea()
一直不明白为什么要初始化Square = Shape:new(),为什么不可以用Square = { } ,经过测试发现,还是对元表没有理解,就简单写了个示例验证
--相当于第一次Shape:new()
mymetatable = {}
self= {key1 = "value1"}
setmetatable(self, mymetatable)
mymetatable.__index = mymetatable
mymetatable.area = 0
print(self.key1, self.area)
--相当于第一次Square:new()函数中的new
o = {key1 = "value2"}
setmetatable(o, mymetatable)
mymetatable.__index = mymetatable
mymetatable.area = 25
print(o.key1, o.area)
setmetatable(o, self)
self.__index = self
print(o.key1, o.area)
print(self.key1, self.area)
多次使用setmetatable, 后面的metatable会覆盖前面。派生类中两次调用基类的new方法,metatable是共用了一个表,即Shape = {}。所以当调用setmetatable(o, self)方法,self会成为o的元表,也可以理解为此时o有两部分,即o = { }、元表 = {area = 25}。