工程目录结构:

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. JAVA如何调用mysql写的存储过程

    存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...

  2. JavaScript DOM2

    1.Window.history:window.open打开网页的方式必须是_self window.history.back()后退 Window.history.forward()前进 <b ...

  3. ef延迟加载不到导航属性问题

    最近做项目踩到了一个ef问题上的坑,导航属性(外键关键,如子表或主表等)“.”出来后是Null,外键值也对,数据库和ef的关系配置也都正确,就是加载不出来.后来发现实体里导航属性前少了个virtual ...

  4. Perl中的哈希(四)

    Perl中的哈希数据结构.相比较于数组,这种数据结构对于数据查找和统计更加方便. 一个特殊的哈希,%ENV,表示当前terminal下,通过setenv设置的variable的键值. 键:环境变量名, ...

  5. Eclipse 启动项目错误:class not found

    其中,很可能的原因:项目存在编译错误,根本没有编译成功,没有生成class文件:可查看problems标签页查看具体错误.

  6. Kintone学习

    kintone JavaScript编码指南 编码的注意地方: 文字编码 使用 utf-8

  7. org.apache.catalina.core.StandardWrapperValve invoke的解决办法

    org.apache.catalina.core.StandardWrapperValve invoke的解决办法 比较容易错的地方是页面带参数进行跳转,由于跳转之后的页面本身也要执行一部分sql语句 ...

  8. Kafka学习之(七)搭建kafka可视化服务Kafka Eagle

    一.下载安装包  kafka-eagle-bin-1.2.4.tar.gz 百度云链接:链接:https://pan.baidu.com/s/1SNIkpsvs20A_Ljtx5PaMuA 密码:o4 ...

  9. WebService(JAX-WS、XFire、Axis三种)获取客户端ip

    WebService(JAX-WS.XFire.Axis三种)获取客户端ip JAX-WS.XFire.Axis三种webservice的获取客户端IP的简单实现过程: 1,基于JDK6 jax-ws ...

  10. C++算法原理与实践(面试中的算法和准备过程)

    第0部分 简介 1. 举个例子:面试的时候,可能会出一道算法考试题,比如写一个 strstr 函数——字符串匹配. 可能会想到用KMP算法来解题,但是该算法很复杂,不适宜在面试中使用. 1.1 C++ ...