Lua 面向对象(实现类的创建和实例化、封装、继承、多态)
2023-09-27 14:29:10 时间
--Lua 面向对象(实现类的创建和实例化、封装、继承、多态)
--1、Lua面向对象基础
--=====================================================
--1.1、Lua类的创建和实例化
--=====================================================
--name、age相当于person对象的成员变量,eat()相当于person对象方法
person={name='张三', age=20}
function person:eat()
print(self.name .. '该吃饭饭了,饿死了')
end
--这个方法用于实例化person对象
function person:new()
local self={}
--使用元表,并把__index赋值为person类
setmetatable(self,{__index = person})
return self
end
--实例化person类
local p = person:new()
p:eat() --正常输出
print("=========================")
--=====================================================
--1.2、Lua封装
--=====================================================
--对age字段进行封装,使其只能用get方法访问
function newPerson(initAge)
local self = {age = initAge};
--三个方法
--添加年龄
local addAge = function(num)
self.age = self.age + num;
end
--扣除年龄
local reduceAge = function(num)
self.age = self.age - num;
end
local getAge = function(num)
return self.age;
end
--返回时只返回方法
return {
addAge = addAge,
reduceAge = reduceAge,
getAge = getAge,
}
end
p1 = newPerson(20)
--没有使用额外的参数self,用的是newPerson里面的self表
--所以要用.进行访问
p1.addAge(10)
p1.reduceAge(100)
print(p1.age) --输出nil
print(p1.getAge()) --输出30
print("=========================")
--=====================================================
--1.3、Lua继承
--=====================================================
--基类person,boy类继承于person
person = {name = "default",age = 0}
function person:eat()
print(self.name .. '该吃饭了,不然会饿死')
end
--使用元表的 __index完成继承(当访问不存在的元素时,会调用)
function person:new(o)
--如果o为false或者o为nil,则让o为{}
o = o or {}
setmetatable(o,self)
--设置上面self的__index为表person
self.__index = self
return o
end
--相当于继承
boy = person:new()
--name在boy里找不到会去person里面找
print(boy.name) --输出default
--修改了person里的值,并不会影响boy里面的值
boy.name = 'feifei'
print(person.name) --输出default
print(boy.name) --输出feifei
print("=========================")
--=====================================================
--1.4、Lua多态
--=====================================================
person = {name = "default",age = 0}
--重载
--简单方法:lua中会自动去适应传入参数的个数,所以我们可以写在一个方法里面
function person:eat(food)
if food == nil then
print(self.name .. '该吃饭饭了,饿死了')
else
print(self.name .. '喜欢吃:' .. food)
end
end
function person:addAge(num)
if num == nil then
self.age = self.age + 1
else
self.age = self.age + num
end
end
print(person:eat())
print(person:eat("大西瓜"))
person:addAge()
print(person.age)
person:addAge(5)
print(person.age)
print("=========================")
--重写
function person:new(o)
--如果o为false或者o为nil,则让o为{}
o = o or {}
setmetatable(o,self)
--设置上面self的__index为表person
self.__index = self
return o
end
boy = person:new()
boy.name = "Ffly"
boy:eat() --调用基类eat方法
--相当于重写eat方法
function boy:eat()
print('小男孩' .. self.name .. '快要饿死了')
end
boy:eat() --调用派生类eat方法
相关文章
- 各种数据库获取前10行记录实例
- 【JAVA】封装:实例和阶段性理解(不断学习,不断更新...)
- c语言的可变参数实例
- C语言——杂实例
- 基于matlab编程卡尔曼滤波跟踪目标实例源码
- axios的封装,响应拦截器的实例
- jQuery File Upload 单页面多实例的实现
- 从零开始学android开发-Json转换利器Gson之实例
- C语言实例
- 《精通Android 实例开发》——第1章,第1.7节使用CMD方式创建Android虚拟设备
- py一些练习实例
- Selenium2学习-026-WebUI自动化实战实例-024-获取页面元素
- vue实战入门基础篇十:从零开始仿门户网站实例-代码重构并发布项目
- Shiro(八):shiro 通过实例工厂方法的方式封装filterChainDefinitionMap
- Linux下TCP通信简单实例
- (1.3.1)sqlserver体系结构,连接安全(连接实例与网络协议及TDS端点)
- Python数据分析实例操作
- 【Unity入门计划】Unity实例-C#如何通过封装实现对数据成员的保护