Lua 面向对象(实现类的创建和实例化、封装、继承、多态)
--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方法