工程目录结构:

ParentMother.lua:

 ParentMother = {}

 function ParentMother:MortherName()
print("Morther name : HanMeimei")
end return ParentMother

ParentFather.lua:

 ParentFather = {}

 function ParentFather:FatherName()
print("Father name : LiLei")
end return ParentFather

Daughter.lua:

 require "ParentMother"
require "ParentFather" Daughter = {} --不是 Daughter 中一个方法
local function Search(key,BaseList)
for i=,#BaseList do
local val = BaseList[i][key]
if val then
return val
end
end
return nil
end --不是 Daughter 中一个方法
local function CreateClass()
local parents = {ParentMother,ParentFather}
setmetatable(Daughter,
{
__index = function(t,k)
return Search(k,parents)
end
})
end function Daughter:new()
local self = {}
CreateClass()
setmetatable(self,{__index = Daughter})
Daughter.__index = Daughter
return self
end function Daughter:DaugtherName()
print("Daugther name : Linda")
end return Daughter --[[
Lua多继承的实现原理:
也是利用的元表和元表的__index字段,不同于对象实例化和单一继承不同的是__index字段赋值的是一个函数而不是一个基类的表。
利用传入__index字段的函数来查找类中找不到的字段(函数中遍历该类继承的多个基类)
--]]

Main.lua:

 require "Daughter"

 local child = Daughter:new()
child:DaugtherName()
child:MortherName()
child:FatherName() --[[
运行结果:
Daugther name : Linda
Morther name : HanMeimei
Father name : LiLei
--]]

码云上的相关工程:https://gitee.com/luguoshuai/LearnLua

新追加的,另外一种实现多重继承的方式:

 Animal = {}
function Animal:ShowType()
print("the is a animal!")
end World = {}
function World:ShowPosition()
print("on the earth!")
end local function Search(k, list)
for i=,#list do
local tmpVal = list[i][k]
if tmpVal then
return tmpVal
end
end
return nil
end local function CreateClass( ... )
local tab = {}
setmetatable(tab,{__index = function (_,k)
return Search(k, arg)
end}) tab.__index = tab function tab:new(o)
o = o or {}
setmetatable(o,tab)
return o
end return tab
end TestClass = CreateClass(Animal, World) local lgs= TestClass:new({""})
lgs:ShowType();

运行结果:

Lua面向对象 --- 多继承的更多相关文章

  1. Lua面向对象----类、继承、多继承、单例的实现

    (本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&a ...

  2. Lua面向对象之二:类继承

    1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...

  3. lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)

    lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...

  4. Lua面向对象之三:其它一些尝试

    1.尝试一:子类对象调用被覆盖了的父类函数 根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了 ①在子类Circle中增加一个调用父类方法的函数 --调用父类被子类覆盖了的name方法 fu ...

  5. Lua面向对象之一:简单例子

    1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法) __index 赋值其实是一个fun ...

  6. Step By Step(Lua面向对象)

    Step By Step(Lua面向对象) Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,见如下代码: 1 Account = {balance = 0}2 function ...

  7. 黑马程序员_Java面向对象2_继承

    4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...

  8. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  9. 【Java基础】【08面向对象_继承&方法&final】

    08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...

随机推荐

  1. 关于 WebBrowser调用百度地图API 鼠标滚轮缩放地图级别失灵的解决办法

    在桌面程序下 百度地图API的鼠标缩放地图功能可能会失灵无效! 这个原因不是API的问题 小弟试了下在WEB上面是没有问题的 于是考虑可能是WebBrowser的获取焦点问题,于是在主窗体 添加了一个 ...

  2. Perl的子程序(二)

    在Perl中可以自己创建子程序(Subroutine): 关键字sub,子程序名以及用花括号封闭起来的代码块. sub  marine { ... } 子程序名与标量的命名空间是不同的两个部分. 子程 ...

  3. Java设计模式应用——观察者模式

    告警结果产生后,可能需要发送短信,邮件,故障管理系统.这些转发操作不应当影响告警生成入库,并且类似事件可能根据不同场景,客户习惯不同,此时,使用观察者模式则可以很好的适应上述场景. 观察者模式应当包括 ...

  4. 20165207 Exp3 免杀原理与实践

    Exp3 免杀原理与实践 1.实验内容 1.1.使用msf 1.1.1. 确定基准线 首先看kali的ip 直接msfvenom的结果,不加其他的东西: 使用VirusTotal得到的检测这个程序得到 ...

  5. JavaScript位运算符 2

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是“位”: 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内 ...

  6. ajax return true/false无效原因

    错误示例:function checkCP(customerId,productId){ $.ajax({ url:"/cp/checkCP", type:"post&q ...

  7. camera按键采集图像及waitKey的用法

    前言 项目需要通过摄像头采集图像并保存,主要是用于后续的摄像头标定.实现过程其实很简单,需要注意一些细节. 系统环境 系统版本:ubuntu16.04:opencv版本:opencv2.4.13:编程 ...

  8. 深入JAVA注解之属性注解

    项目目录结构 实体类: package org.guangsoft.annotation.entity; import java.lang.annotation.ElementType; import ...

  9. 解决Navicat Premium 12 连接oracle数据库出现ORA-28547的问题

    1. 出现的问题... 下午工作时想连接Oracle数据库,使用的是Navicat Premium 12 . 数据库地址.用户名.密码.端口号都没有问题,但出现了ORA-28547:connectio ...

  10. C++ vector 删除一个指定元素 和 find 一个指定元素以及遍历删除、 map遍历删除元素和删除find到的元素

    vector: 1.delete element 转载:http://www.cnblogs.com/xudong-bupt/p/3522457.html #include <vector> ...