开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
继承
继承是指一个对象直接使用另一对象的属性和方法。可用于扩展基础类的属性和方法。在lua里是没有类的概念的,但是可以利用表(table)和元表特性来实现面向对象和继承。lua的表类似于一个对象,每个对象都有自己的方法和属性。当访问一个表中不存在的属性时,系统不会直接返回错误,而是访问该表的元表中的 __index 元方法。 __index 元方法既可以是一个方法,也可以是一张表,当 __index 为表时,从 __index 指示的表中查询不存在的属性,当 __index 为方法时,访问不存在的属性会触发调用此方法。
我们可以重新定义从基类继承的任意方法。只需要编写一个新方法就行了。 lua语言中的对象有一个有趣的特性,就是无须为了指定一种新行为而创建一个新类。
举个例子:
-- Meta class
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
接下来的实例,Square 对象继承了 Shape 类:
Square = Shape:new()
-- Derived class method new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
多重继承
其实多重继承没什么特别的,除非两个将要被继承的类有相同的函数名和属性,否则,处理起来很简单。
无非就是在多个table中查找某个字段而已,不简单吗?Lua里的继承就是在别人的table里查找自己不存在的字段罢了。
那么,单继承与多重继承的差别也在这里,一个是只查找一个table,另一个是查找两个或以上的table。