当前位置: 首页 > news >正文

Lua如何实现面向对象的三大特性?

Lua 本身没有像 Java、C# 那样内置的面向对象机制,但可以通过 Lua 的表(table)和元表(metatable)来模拟实现面向对象的三大特性:封装、继承和多态。

目录

1. 封装

2. 继承

3. 多态


1. 封装

封装是指将数据和操作数据的方法绑定在一起,隐藏对象的内部实现细节,只对外提供必要的接口。在 Lua 中,可以使用表来实现封装。

下面是lua代码示例(该lua代码在Sublime Text之中运行)

-- 定义一个类(其实是一个表)
local Person = {}

-- 构造函数
function Person:new(name, age)
    local obj = {}
    self.__index = self
    setmetatable(obj, self)
    -- 封装属性
    obj.name = name
    obj.age = age
    return obj
end

-- 封装方法
function Person:introduce()
    print("My name is " .. self.name .. ", and I'm " .. self.age .. " years old.")
end

-- 创建对象
local person = Person:new("John", 25)
-- 调用方法
person:introduce()

在上述代码中,Person 是一个表,代表一个类。new 函数是构造函数,用于创建 Person 类的对象。introduce 是一个方法,用于打印对象的信息。通过这种方式,将属性和方法封装在 Person 类中。

运行结果:

2. 继承

继承是指一个类可以继承另一个类的属性和方法,从而实现代码的复用。在 Lua 中,可以通过设置元表来实现继承。

下面是lua代码示例(该lua代码在Sublime Text之中运行)

-- 基类 Person
local Person = {}

function Person:new(name, age)
    local obj = {}
    self.__index = self
    setmetatable(obj, self)
    obj.name = name
    obj.age = age
    return obj
end

function Person:introduce()
    print("My name is " .. self.name .. ", and I'm " .. self.age .. " years old.")
end

-- 子类 Student 继承自 Person
local Student = {}
setmetatable(Student, {__index = Person})

function Student:new(name, age, grade)
    local obj = Person:new(name, age)
    self.__index = self
    setmetatable(obj, self)
    -- 新增属性
    obj.grade = grade
    return obj
end

-- 新增方法
function Student:study()
    print(self.name .. " is studying in grade " .. self.grade .. ".")
end

-- 创建 Student 对象
local student = Student:new("Alice", 20, 3)
-- 调用基类方法
student:introduce()
-- 调用子类方法
student:study()

在上述代码中,Student 是 Person 的子类。通过 setmetatable(Student, {__index = Person}) 让 Student 继承 Person 的属性和方法。Student 类还可以定义自己的属性和方法。

运行结果:

3. 多态

多态是指不同的对象对同一消息做出不同的响应。在 Lua 中,可以通过重写方法来实现多态。

下面是lua代码示例(该lua代码在Sublime Text之中运行)

-- 基类 Shape
local Shape = {}

function Shape:new()
    local obj = {}
    self.__index = self
    setmetatable(obj, self)
    return obj
end

function Shape:draw()
    print("Drawing a shape.")
end

-- 子类 Circle 继承自 Shape
local Circle = {}
setmetatable(Circle, {__index = Shape})

function Circle:new()
    local obj = Shape:new()
    self.__index = self
    setmetatable(obj, self)
    return obj
end

-- 重写 draw 方法
function Circle:draw()
    print("Drawing a circle.")
end

-- 子类 Rectangle 继承自 Shape
local Rectangle = {}
setmetatable(Rectangle, {__index = Shape})

function Rectangle:new()
    local obj = Shape:new()
    self.__index = self
    setmetatable(obj, self)
    return obj
end

-- 重写 draw 方法
function Rectangle:draw()
    print("Drawing a rectangle.")
end

-- 定义一个函数,接收 Shape 类型的对象
function drawShape(shape)
    shape:draw()
end

-- 创建不同的对象
local circle = Circle:new()
local rectangle = Rectangle:new()

-- 调用 drawShape 函数,实现多态
drawShape(circle)
drawShape(rectangle)

在上述代码中,Circle 和 Rectangle 都继承自 Shape 类,并且重写了 draw 方法。drawShape 函数接收一个 Shape 类型的对象,根据传入的对象类型不同,调用不同的 draw 方法,从而实现了多态。

运行结果:

相关文章:

  • Linux第五讲----gcc与g++,makefile/make
  • Halcon 算子-承接车牌识别
  • FPGA标准库-Open Logic
  • 376_C++_云透传,板端负责处理透传数据的API函数,用于实现客户端对设备内部接口的访问(VMS把数据直接传给板端内部)
  • 音频3A测试--AGC(自动增益)和NS(降噪)测试
  • 【监控】使用Prometheus+Grafana搭建服务器运维监控面板(含带BearerToken的Exporter配置)
  • 2024北京理工大学计算机复试上机真题
  • 《AJAX:前端异步交互的魔法指南》
  • 828华为云征文|使用sysbench对Flexus X实例对mysql进行性能测评
  • VirtualBox虚拟机MacOS从Big Sur升级到Sequoia(失败)
  • 软件架构师日常工作和核心技能
  • Keepalived 入门详解:高可用集群部署最佳实践!
  • 动静态库-Linux 学习
  • 拉拉扯扯adfda
  • 【c语言指针精选题】
  • 使用ast获取py文件中所有函数与类名
  • IPOIB 驱动中的发送完成处理机制
  • 深度集成DeepSeek,智问BI@GPT引领商业智能“深度思考“革命
  • 家政预约小程序用例图分析
  • 迷你世界脚本计时器接口:MiniTimer
  • wordpress 网站投票/百度总部
  • 辽宁省建设厅安全员考试官方网站/市场营销的策划方案
  • 夫妻做网站/英文网站建设
  • 网站开发课程总结/企业培训课程开发
  • wordpress网站加载慢/百度提交收录入口
  • 网站内怎样做关键词有效果/免费发广告的网站