面向对象最基本的就是两点:类,对象。
但是lua是无类型的,要实现面向对象只能模拟实现。
其实他们都是表,多了个__index属性,就模拟出了实现“类和继承”的效果。
面对Lua千万别用c++的类来类比,不然会误入歧途!
它就是一个table而已下面一个典型的定义一个“类”的方式。
class={} function class:new(o) local o=o or {} setmetatable(o,self) self.__index=self o:ctor() return o end
第一行,因为是个表当然要定义下表结构。
第二行,这里等于function class.new(class,o),self==class。这样写是方面后面继承。
第三行,定义或者获取外部一个o表,这个才是我们模拟的所谓“对象”的实体。
第四,五行,一起看 setmetatable(o,self) self.__index=self,就是让class成为o表的元表,index也是class,这样o里没有的就找class表读取。不懂可以找找__index相关知识。
最后,o:ctor() 模拟构造函数,然后返回这个o
然后定义个函数吧.
1 function class:ctor() 2 self.data=1 3 end
这里class:ctor()等于class.ctor(self) ,self==class,说是表class.data=1。虽然看起来像是一个类的方法定义,但其实只是一个表的元素赋值。但是只是现在目前self是class表,后面可能不同了。 然后我们执行 a=class:new()就创建出了一个a对象。这个对象里面目前没有c++对象的函数表,也没有成员。就是一个空表,挂了一个metatable成员。这句代码分解开就是
function class:new() local o= {} setmetatable(o,class) class.__index=class o:ctor() --因为o是空表,所以只能去元表里找ctor这个函数,所以执行的效果如下面代码 return o end function class.ctor(o) o.data=1 end
现在a={data=1,metatable=class},于是对象就实例化出来了。
有个成员data,但是函数还是在class中,调用函数就到class里找,不同的就是那个self==o,于是看起来这就是个对象了。
以此类推,给class添加函数就是给o“添加函数”,ctor里self增加成员就是给o添加成员。
时间: 2024-09-30 15:52:04