继承
由于类也是对象(准确地说是一个原型),它们也可以从其它类(原型)获得(继承)方法。这种行为就是继承,可以很容易的在Lua中实现。现在我们有一个类(原型,其实在Lua中说类这个概念,还是很别扭的,毕竟用C++的脑袋去想,还是觉的有点奇怪的。)CA:
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,则需要创建一个空的类,从基类继承所有的操作:
local CLittleA = CA:new()
现在,我创建了一个CA类的一个实例对象,在Lua中,现在CLittleA既是CA类的一个实例对象,也是一个原型,就是所谓的类,就相当于CLittleA类继承自CA类。再如下面的代码:
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函数。