Lua 面向对象

面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。

LUA中最基本的结构是table,所以需要用table来描述对象的属性。
lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。


简例:

-- Czhenya Lua 面向对象

-- 对于一个对象来说, 属性 方法

--[[ 两种定义函数的方式
person.eat = function()
	print(person.name.."在写LUA")
end

function person.eat()
	print(person.name.."在写LUA")
end
--]]


--作为原型
Person = {name = 'Czhena',age = 22}

function Person:eat()
	print(self.name.."的年龄是"..self.age)
end

function Person:new(o)    -- 若o是空的则返回false

	local t = o or {}

	--[[ 和下面设置结果一样,只是两种不同的方式
	setmetatable{t,self}
	self.__index=self
	--]]

	setmetatable(t,{__index = self})	--设置元表
	--调用一个属性的时候,如果t中不存在,就会在__index所指的table中查找
	return t
end

-- 类似于通过构造函数创建对象
person1 = Person:new({weight = 100})

person2 = Person:new()

print(person1.name)
print(person1.weight)
print(person2.name)

person1.name = "CZY"   --不会改变元表,添加到person.name
person1:eat()
person2:eat()


--继承

Student = Person:new()
Student.grade = 1

stu1 = Student:new()
stu1:eat()
print(stu1.grade)


冒号和点定义函数的区别:

-- 使用冒号和点来的定义函数,建议用什么定义函数,用什么调用

person = {name="Czhenya",age=22}

function person:eat()
	print(self.name.."的年龄是"..self.age)
end

person.eat(person)

a = person

--冒号调用self自动赋值
a:eat()

--通过点来调用的时候,self不会自动赋值,必须通过参数传递
a.eat(a)


模拟实现继承:

A={}
function A:New() --A表 --> 模拟基类
    local t={}
    setmetatable(t,self)
    self.__index=self
    t.base=self
    return t
end

function A:func()
    print(self,'这是基类A表的Func函数')
end


B=A:New() 	--B表 --> 一级派生类

function B:New() --相当于重新重写A:New()
    local t={}
    setmetatable(t,self)
    self.__index=self
    return t
end
function B:func() --
    print(self,'这是派生类B表的Func函数')
    self.base:func()
    print('B:func 执行完成')
end

c=B:New() --二级派生类
c:func()
--[[
table: 00BA9938	这是派生类B表的Func函数
table: 00BA9488	这是基类A表的Func函数
B:func 执行完成
]]

d = B:New() --二级派生类
d:func()

--[[
table: 00BA98C0	这是派生类B表的Func函数
table: 00BA9488	这是基类A表的Func函数
B:func 执行完成
]]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈言必行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值