Lua知识点八 面向对象程序设计

本文深入探讨Lua中的面向对象编程概念,包括表作为对象、类与继承机制、多重继承的实现方式及其效率问题,以及如何在Lua中实现私有成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;

Lua不存在类的概念,每个对象定义他自己的行为并拥有自己的形状(shape)。每个对象都有一个prototype(原型),当调用不属于对象的某些操作时,会最先会到prototype中查找这些操作。在这类语言中实现类(class)的机制,我们创建一个对象,作为其它对象的原型即可(原型对象为类,其它对象为类的instance)。

继承

继承使得类可以访问其他类的方法
在Lua中面向对象有趣的一个方面是你不需要创建一个新类去指定一个新的行为。

多重继承

实现的关键在于:将函数用作__index。记住,当一个表的metatable存在一个__index函数时,如果Lua调用一个原始表中不存在的函数,Lua将调用这个__index指定的函数。这样可以用__index实现在多个父类中查找子类不存在的域。
多重继承意味着一个类拥有多个父类,所以,我们不能用创建一个类的方法去创建子类。
由于搜索的复杂性,多重继承的效率比起单继承要低。

私有性

Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分。
Lua的另一个目标是灵活性,提供程序员元机制(meta-mechanisms),通过他你可以实现很多不同的机制。
首先,函数创建一个表用来描述对象的内部状态,并保存在局部变量self内。然后,函数为对象的每一个方法创建闭包(也就是说,嵌套的函数实例)。最后,函数创建并返回外部对象,外部对象中将局部方法名指向最终要实现的方法。这儿的关键点在于:这些方法没有使用额外的参数self,代替的是直接访问self。

single-method的对象实现方法

当这个single-method实际是一个基于重要的参数而执行不同的任务的分派(dispatch)方法时。
Tcl/Tk 的窗口部件(widgets)使用了相似的方法,在Tk中一个窗口部件的名字表示一个在窗口部件上执行各种可能操作的函数(a widget command)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月光下的自由码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值