Lua 面向对象
【摘要】 面向对象编程(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)