Lua语言——继承

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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。