企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 继承 由于类也是对象(准确地说是一个原型),它们也可以从其它类(原型)获得(继承)方法。这种行为就是继承,可以很容易的在Lua中实现。现在我们有一个类(原型,其实在Lua中说类这个概念,还是很别扭的,毕竟用C++的脑袋去想,还是觉的有点奇怪的。)CA: ```lua local CA = {value = 0} function CA:new(o) o = o or {} setmetatable(o, self) self.__index = self return o end function CA:display() print(self.value) end function CA:addValue(v) self.value = self.value + v end ``` 现在需要从这个CA类派生出一个子类CLittleA,则需要创建一个空的类,从基类继承所有的操作: ```lua local CLittleA = CA:new() ``` 现在,我创建了一个CA类的一个实例对象,在Lua中,现在CLittleA既是CA类的一个实例对象,也是一个原型,就是所谓的类,就相当于CLittleA类继承自CA类。再如下面的代码: ```lua local s = CLittleA:new{value1 = 10} ``` CLittleA从CA继承了new;不过,在执行CLittleA:new时,它的self参数表示为CLittleA,所以s的元表为CLittleA,CLittleA中字段\_\_index的值也是CLittleA。然后,我们就会看到,s继承自CLittleA,而CLittleA又继承自CA。当执行s:display时,Lua在s中找不到display字段,就会查找CLittleA;如果仍然找不到display字段,就查找CA,最终会在CA中找到display字段。可以这样想一下,如果在CLittleA中存在了display字段,那么就不会去CA中再找了。所以,我们就可以在CLittleA中重定义display字段,从而实现特殊版本的display函数。