lua 面向对象

-- 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值