Lua 面向对象

举报
陈言必行 发表于 2021/08/13 23:21:23 2021/08/13
【摘要】 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 LUA中最基本的结构是table,所以需要用table来描述对象的属性。 lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。 简例: -- Czhenya 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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58


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

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

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)


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

模拟实现继承:

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/78484215

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。