-- lua 面向对象
--封装1
r = {area = 0,length = 0,breadth = 0}
function r:new(length,breadth)
self.length = length or 0
self.breadth = breadth or 0
self.area = self.length * self.breadth
return self
end
local r1 = r:new(1,2)
print(r1.length,r1.area) --1 2
print(r.length,r.area) --1 2
local r2 = r:new(10,20)
print(r1.length,r1.area) --10 200
print(r2.length,r2.area) --10 200
print(r.length,r.area) --10 200
print(r,r1,r2) --table: 0055B280 table: 0055B280 table: 0055B280
--以上的封装有问题:调用r:new()生成的r1及r2其实都是r的引用,所以操作r,r1,r2中的任意一个,其他两个的值也会改变
--封装2
s = {area = 0,side = 0}
function s:new(side)
local o = {
side = side or 0,
area = side * side
}
return o
end
function s:getInfo()
return self.side,self.area
end
s1 = s:new(10)
s2 = s:new(20)
print(s.side,s.area) --0 0
print(s1.side,s1.area) --10 100
print(s2.side,s2.area) --20 400
print(s,s1,s2) --table: 004FB3E8 table: 004FB410 table: 004FB438
--以上的封装还是有问题,虽然创建出了不同的table,但是新创建的s1,s2没有封装好的方法getInfo
--print(s1.getInfo()) --lua: test7.lua:40: attempt to call field 'getInfo' (a nil value)
--封装3:这种封装还是正确的
t = {base = 0, high = 0, area = 0}
function t:new(base,high)
local o = {
base = base or 0,
high = high or 0,
area = base * high / 2
}
setmetatable(o,self)
self.__index = self
return o
end
function t:doubleBase()
return self.base * 2,self.high,self.area
end
function t:getInfo()
return self.base,self.high,self.area
end
t1 = t:new(10,5)
t2 = t:new(20,10)
print(t.base,t.high,t.area) --0 0 0
print(t1.base,t1.high,t1.area) --10 5 25
print(t2.base,t2.high,t2.area) --20 10 100
print(t,t1,t2) --table: 008AB438 table: 008AB460 table: 008AB488
print(t:getInfo()) --0 0 0
print(t1:getInfo()) --10 5 25
print(t2:getInfo()) --20 10 100
--继承
t3 = t:new(0,0) --这里必须是父类的对象
function t3:new(base,high)
local o = t:new(base,high)
setmetatable(o,self)
self.__index =self
return o
end
function t3:getInfo()
return "底" .. self.base , "高" .. self.high , "面积" .. self.area
end
t31 = t3:new(30,6)
print(t31:doubleBase()) --父类的方法:60 6 90
print(t31:getInfo()) --子类的方法:底30 高6 面积90
lua 面向对象
最新推荐文章于 2023-02-01 10:06:28 发布