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

Lua语言入门 - Lua 面向对象

Lua 面向对象

面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构,通过创建和操作对象来设计应用程序。

以下几种编程语言都支持面向对象编程:

  • C++
  • Java
  • Objective-C
  • Smalltalk
  • C#
  • Ruby

Lua 是一种轻量级的脚本语言,虽然它不像 Java 或 C++ 那样内置强大的面向对象(OO)特性,但它非常灵活,可以通过一些技巧实现面向对象编程。

面向对象特征

  • 封装:将数据和方法捆绑在一起,隐藏实现细节,只暴露必要的接口,提高安全性和可维护性。

  • 继承:通过派生新类复用和扩展现有代码,减少重复编码,提高开发效率和可扩展性。

  • 多态:同一操作作用于不同对象时表现不同,支持统一接口调用,增强灵活性和扩展性。

  • 抽象:简化复杂问题,定义核心类和接口,隐藏不必要的细节,便于管理复杂性。

Lua 中面向对象

我们知道,对象由属性和方法组成。

Lua 中的类可以通过 table + function 模拟出来。

至于继承,可以通过 metetable 模拟出来(不推荐用,只模拟最基本的对象大部分实现够用了)。

在 Lua 中,最基本的结构是 table,我们可以使用表(table)来创建对象。

ClassName = {}  -- 创建一个表作为类

通过 new 方法(或其他名称)创建对象,并初始化对象的属性。

function ClassName:new(...)
    local obj = {}  -- 创建一个新的空表作为对象
    setmetatable(obj, self)  -- 设置元表,使对象继承类的方法
    self.__index = self  -- 设置索引元方法
    -- 初始化对象的属性
    obj:init(...)  -- 可选:调用初始化函数
    return obj
end

表(table)是 Lua 中最基本的复合数据类型,可以用来表示对象的属性。

Lua 中的 function 可以用来表示方法:

function ClassName:sayHello()
    print("Hello, my name is " .. self.name)
end

 使用 new 方法来创建对象,并通过对象调用类的方法。

local obj = ClassName:new("Alice")  -- 创建对象
obj:sayHello()  -- 调用对象的方法
-- 定义 Person 类
Person = {name = "", age = 0}

-- Person 的构造函数
function Person:new(name, age)
    local obj = {}  -- 创建一个新的表作为对象
    setmetatable(obj, self)  -- 设置元表,使其成为 Person 的实例
    self.__index = self  -- 设置索引元方法,指向 Person
    obj.name = name
    obj.age = age
    return obj
end

-- 添加方法:打印个人信息
function Person:introduce()
    print("My name is " .. self.name .. " and I am " .. self.age .. " years old.")
end

代码说明:

  • Person 是一个表,它有两个属性:name 和 age,这两个属性是类的默认属性。
  • Person:new(name, age) 是一个构造函数,用来创建新的 Person 对象。
  • local obj = {} 创建一个新的表作为对象,setmetatable(obj, self) 设置元表,使得该表成为 Person 类的实例。
  • self.__index = self 设置索引元方法,使得 obj 可以访问 Person 类的属性和方法。
  • introduce 是 Person 类的方法,打印该 Person 对象的名字和年龄。

调用方法:

-- 创建一个 Person 对象
local person1 = Person:new("Alice", 30)

-- 调用对象的方法
person1:introduce()  -- 输出 "My name is Alice and I am 30 years old."


http://www.kler.cn/a/452532.html

相关文章:

  • cesium入门学习二
  • mongodb和Cassandra
  • 大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库
  • 每日一题 343. 整数拆分
  • 极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【二】
  • 【ES6复习笔记】Symbol 类型及其应用(9)
  • Excel粘贴复制不完整的原因以及解决方法
  • 在git commit之前让其自动执行一次git pull命令
  • [python SQLAlchemy数据库操作入门]-05.插入数据:记录单笔股票交易信息
  • 【学习总结|DAY023】Java高级技术
  • SpringBoot统计接口请求耗时
  • Docker 部署 plumelog 最新版本 实现日志采集
  • 【前端必读】如何免费无限使用Cursor:AI编程工具的终极指南!
  • Merry Christmas HTML
  • Redis——缓存击穿
  • NetLimiter使用教程,并掌握其基本的网络管理和流量控制能力
  • 聊一聊 C#线程池 的线程动态注入 (下)
  • Flutter项目兼容鸿蒙Next系统
  • 外包干了27天,技术退步明显。。。。。
  • MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
  • UDP传输层通信协议详解
  • 33 Opencv ShiTomasi角点检测
  • 获取 jakarta.servlet.http.HttpServletRequest请求IP
  • 【stm32can】
  • C# Winform打开和预览PDF,方法一:调用CefSharp包,内嵌浏览器
  • EMS(energy managment system)从0到1