📅  最后修改于: 2023-12-03 15:02:49.008000             🧑  作者: Mango
Lua是一种面向对象的脚本语言,它的面向对象特性是基于原型的。
在Lua中,一个类可以用一个table来表示,table的属性可以作为类的字段,属性的值可以作为初始值。
-- 定义一个类
Person = { name = "default", age = 0 }
-- 创建一个对象
p = Person
-- 访问属性
print(p.name) -- 输出 "default"
print(p.age) -- 输出 0
-- 修改属性
p.name = "Tom"
p.age = 20
print(p.name) -- 输出 "Tom"
print(p.age) -- 输出 20
在Lua中,方法被定义为table中的一个函数。
-- 定义一个类
Person = {}
-- 定义一个方法
function Person:sayHello()
print("Hello, my name is " .. self.name)
end
-- 创建一个对象
p = Person
-- 访问方法
p.name = "Tom"
p:sayHello() -- 输出 "Hello, my name is Tom"
Lua中的继承是通过原型链实现的,子类可以通过设置父类作为它的原型来继承父类的属性和方法。
-- 定义一个父类
Person = {}
function Person:new(name, age)
local obj = { name = name, age = age }
setmetatable(obj, self)
self.__index = self
return obj
end
function Person:sayHello()
print("Hello, my name is " .. self.name)
end
-- 定义一个子类
Man = Person:new()
function Man:killFishing()
print("I am killing fishing!")
end
-- 创建一个对象
man = Man:new("Tom", 20)
-- 访问父类方法
man:sayHello() -- 输出 "Hello, my name is Tom"
-- 访问子类方法
man:killFishing() -- 输出 "I am killing fishing!"
在Lua中,用table作参数即可实现多态:
-- 定义一个类
Person = {}
Person.meta = { __index = Person }
function Person:new(name, age)
local obj = { name = name, age = age }
setmetatable(obj, self.meta)
return obj
end
function Person:sayHello()
print("Hello, my name is " .. self.name)
end
-- 定义一个子类
Man = {}
Man.meta = { __index = Man }
setmetatable(Man, Person.meta)
function Man:new(name, age)
local obj = { name = name, age = age, gender = "male" }
setmetatable(obj, self.meta)
return obj
end
-- 多态
function greet(p)
p:sayHello()
end
-- 创建两个对象
p = Person:new("Jack", 18)
m = Man:new("Tom", 20)
-- 输出结果
greet(p) -- 输出 "Hello, my name is Jack"
greet(m) -- 输出 "Hello, my name is Tom"
Lua的面向对象机制是基于原型的,通过table来表示类和对象,方法也是table中的一个函数。通过原型链实现继承,使用table作参数来实现多态。