热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解说Lua中的面向对象

面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程。在Lua中,并没有面向对象的概念存在

面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程。在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承。

一、复制表的方式面向对象

–Lua中的面向对象

–[[

复制表方式面向对象

参数为一张表,通过遍历这张表取值,赋给一张空表,最后返回新建的表,来达到克隆表

]]

function clone(tab)

local ins = {}

for key, var in pairs(tab) do

ins[key] = var

end

return ins

end

–[[

复制表

第一参数是目标表,第二个参数是需要复制的表

通过遍历tab来取值将它赋值到目标表中

]]

function copy(dist,tab)

for key, var in pairs(tab) do

dist[key] = var

end

end

— 定义一张空表,相当于一个类

People ={}

–function People.sayHi()

— print(“People say hi”)

–end

— 定义类中的方法sayHi,传入一个self参数

People.sayHi = function (self)

print(“People say hi:”..self.name)

end

— 定义一个new方法,传进一个name参数,通过克隆People这张表来生成一个对象

— 相当于类当中的一个构造方法

People.new = function (name)

local self = clone(People)

self.name = name

return self

end

–local p = clone(People)

–p.sayHi()

–生成一个新的对象

local p = People.new(“ZhangSan”)

–p.sayHi(p)

–p:sayHi()

–定义一张空表,也代表一个类

Man = {}

–Man中的构造方法,实现Lua中类的继承

Man.new = function (name)

local self = People.new(name)

–附加Man中所有的键值对到People中的实例中去

copy(self,Man)

return self

end

Man.sayHello = function ()

print(“Man say hello”)

end

–重写父类People中的sayHi方法

Man.sayHi = function (self)

print(“Man sayHi “..self.name)

end

–创建Man的一个实例

local m = Man.new(“Lisi”)

m:sayHi()

二、使用函数闭包的形式实现面向对象

–以函数闭包的形式实现面向对象

–定义一个方法,函数闭包实现一个类的概念

function People(name)

local self = {}

–初始化方法,私有的

local function init()

self.name = name

end

self.sayHi = function ()

print(“Hello “..self.name)

end

–调用初始化

init()

return self

end

–实例化一个对象

local p = People(“ZhangSan”)

p:sayHi()

–函数闭包的形式实现类继承

function Man(name)

local self = People(name)

— local function init()

— end

self.sayHello = function ()

print(“Hi “..self.name)

end

return self

end

local m = Man(“Lisi”)

–m:sayHello()

m:sayHi()


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 第14周实践项目(4)-验证平衡二叉树
    问题**Copyright(c)2015,烟台大学计算机学院*Allrightsreserved.*文件名称:test.cpp*作者:王敏*完成日 ... [详细]
  • 深入理解Redis中的字典实现
    本文详细介绍了Redis中字典的实现机制,包括其底层数据结构、哈希表与哈希节点的关系、元素添加方法及rehash操作的具体流程。 ... [详细]
  • 解决Unreal Engine中UMG按钮长时间按住自动释放的问题
    本文探讨了在Unreal Engine中使用UMG按钮时,长时间按住按钮会导致自动释放的问题,并提供了详细的解决方案。 ... [详细]
  • 本文将详细介绍如何在 Vue 项目中使用 Handsontable 插件,包括 npm 安装、基本配置和常用功能的实现。 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
author-avatar
社会逼我爱上Money_717
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有