local Rect = {area = 0,length = 0,windth = 0};
function Rect:new(length,windth)
local t = {};
setmetatable(t,self);
self.__index = self;
t.length = length;
t.windth = windth;
t.area = t.length * t.windth;
return t;
end
function Rect:ShowArea()
print(self.area);
end
local a = Rect:new(1,2);
local b = Rect:new(3,4);
a:ShowArea();
b:ShowArea();
print(a);
print(b);
Rectangle = {area = 0, length = 0, breadth = 0}
function Rectangle:new (o,length,breadth)
o = o or {}
setmetatable(o, self)
self.__index = self
self.length = length or 0
self.breadth = breadth or 0
self.area = length*breadth;
return o
end
function Rectangle:printArea ()
print("矩形面积为 ",self.area)
end
-- 创建
local r = Rectangle:new(nil, 2, 3);
local p = Rectangle:new(nil, 4, 5);
-- 输出
r:printArea();
p:printArea();
结果:
矩形面积为 20
矩形面积为 20
也就是说,p 和 r 其实不是两个完全无关的对象。
2079Lua 面向对象
其中 A 为抽象类,B 为矩形类,C 为立方体类。
C 继承 B,B 继承 A。
类对象各自独立,不影响类默认成员属性值。
B = {length, width, area}
function B:new(len,wid)
local A = {length=0,width=0}
local o = {}
setmetatable(o,A)
B.__index=A
o.length=len or A.length
o.width=wid or A.width
o.area=o.length*o.width
return o
end
a=B:new(2,3)
b=B:new(3,4)
print("长方形a的面积为"..a.area)
print("长方形b的面积为"..b.area)
print("长方形a的面积仍然为"..a.area..", a与b独立存在")
c=B:new()
print("长方形c根据默认构造函数的面积为"..c.area..", c的长宽分别为",c.length,c.width)
--立方体C,继承长方形类B
C = {high=0, volume=0, rectangle=B.new()} --增加体积值和高度
C.__index=C
function C:new(len, wid, hig)
local o={}
setmetatable(o,C) --将原始类C作为它对象的原表
o.rectangle=B:new(len,wid)
o.high=hig or C.high
o.volume=o.high*o.rectangle.area
return o
end
cubeA=C:new(2,3,4)
cubeB=C:new(3,4,5)
print("立方体A的体积为"..cubeA.volume)
print("立方体B的体积为"..cubeB.volume)
print("立方体A的体积仍然为"..cubeA.volume..", A与B独立存在")
print("立方体A底面长方体的长与宽分别为"
,cubeA.rectangle.length
,cubeA.rectangle.width)
print("立方体B底面长方体的长与宽分别为"
,cubeB.rectangle.length
,cubeB.rectangle.width)
print("cubeA和cubeB的底边长方形同样独立存在")
2083lua-for-loop.html
在lua中pairs与ipairs两个迭代器的用法相近,但有一点是不一样的:
pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
但是ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key
2082Lua 数据库访问
5.2 版本之后,require 不再定义全局变量,需要保存其返回值。
需要写成:
2081Lua 面向对象
回楼上,两个新建实例并没有关系,只是新建实例时修改了元表,第二次新建覆盖了值:
输出结果:
2080Lua 面向对象
我的实测结果与作者的理论有出入,先创建多个对象,然后再依次输出,会发现结果都是最后一个对象的值。
Rectangle 的封装:
结果:
也就是说,p 和 r 其实不是两个完全无关的对象。
2079Lua 面向对象
其中 A 为抽象类,B 为矩形类,C 为立方体类。
C 继承 B,B 继承 A。
类对象各自独立,不影响类默认成员属性值。