📜  Lua-面向对象(1)

📅  最后修改于: 2023-12-03 15:02:49.008000             🧑  作者: Mango

Lua-面向对象

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作参数来实现多态。