Lua 中模拟 类



LUA类
类一般都有类名,属性声明,构造体,方法,属性。下面用LUA实现类的模拟,类的模拟有很多种,但是都必须用到__index

下面看看代码吧

--声明了类名还有属性,并且给出了属性的初始值。
Class = {x = 0, y = 0}
--这句是重定义元表的索引
Class.__index = Class

--构造体,构造体的名字是随便起的,一般都叫名为 new()
function Class:new(x,y)
	--初始化self,如果没有这句,那么类所建立的对象改变,其他对象都会改变
	local self = {}
	 --将self的元表设定为Class
	setmetatable(self, Class)
	 --属性值初始化
	self.x = x
	self.y = y
	--返回自身
	return self
end

--这里定义类的其他方法
function Class:Show()
	print("x = " .. self.x .. "     y = " .. self.y)
end

function Class:plus()
	self.x = self.x + 10
	self.y = self.y + 10
end

-- 类的定义完毕,开始建立对象
--[[
local a = Class:new(12,21)
a:Show()
a:plus()
a:Show()
local b = Class:new(99,99)
b:Show()
b:plus()
b:Show()
--]]

--[[
2,继承
 
LUA之中没有继承的概念,但是可以模拟,
我们建立一个新的类Main,它是Class类的子类,
包含其一切方法。
--]]

--声明了新的属性Z
ClassTo = {z = 0}
--设置类型是Class
setmetatable(ClassTo, Class)
--还是和类定义一样,表索引设定为自身
ClassTo.__index = ClassTo
--这里是构造体,多加上了一个新的参数
function ClassTo:new(x,y,z)
	--初始化对象自身
	local self = {}
	--将对象自身设定为父类,这个语句相当于其他语言的super
	self = Class:new(x,y)
	--将对象自身元表设定为Main类
	setmetatable(self, ClassTo)
	--新的属性初始化,如果没有将会按照声明=0
	self.z = z
	--返回自身
	return self
end

--定义一个新的方法
function ClassTo:go()
	self.x = self.x + 100
end
--重定义父类的方法
function ClassTo:Show()
	print("x = " .. self.x .. "     y = " .. self.y .. "      z = " .. self.z)
end

-- 然后建立对象
--[[
local c = ClassTo:new(1,10,100)
c:Show()
local d = ClassTo:new(100, 10, 1)
d:go()
d:Show()
d:plus()
d:Show()
c:Show()
--]]

--[[
3,多态

LUA作为动态语言,支持多态是基本,但是对象?
  马上为您呈现
--]]

--在Class中新定义的一个函数getNum()
function Class:getNum()
	return 100
end
--这里会引用getNum()
function Class:NumToDoubled()
	return self:getNum() * 2
end

--在 ClassTo 中重新定义了getNum()
function ClassTo:getNum()
	return 50
end

-- 演示多态
local a = Class:new(10, 20)
print(a:NumToDoubled())
local b = ClassTo:new(10, 50, 200)
print(b:NumToDoubled())
print(a:NumToDoubled())

--[[
调用LUA类的属性请使用点号,而调用其方法请使用冒号
--]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值