当前位置 博文首页 > 做自己擅长的事:Lua知识点八 面向对象程序设计

    做自己擅长的事:Lua知识点八 面向对象程序设计

    作者:[db:作者] 时间:2021-07-15 09:57

    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)。

    cs
    下一篇:没有了