Lua面向对象 --- 多继承
工程目录结构:

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面向对象 --- 多继承的更多相关文章
- Lua面向对象----类、继承、多继承、单例的实现
(本文转载)学习之用,侵权立删! 原文地址 http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&a ...
- Lua面向对象之二:类继承
1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...
- lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)
lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...
- Lua面向对象之三:其它一些尝试
1.尝试一:子类对象调用被覆盖了的父类函数 根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了 ①在子类Circle中增加一个调用父类方法的函数 --调用父类被子类覆盖了的name方法 fu ...
- Lua面向对象之一:简单例子
1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法) __index 赋值其实是一个fun ...
- Step By Step(Lua面向对象)
Step By Step(Lua面向对象) Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,见如下代码: 1 Account = {balance = 0}2 function ...
- 黑马程序员_Java面向对象2_继承
4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- 【Java基础】【08面向对象_继承&方法&final】
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...
随机推荐
- JAVA如何调用mysql写的存储过程
存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...
- JavaScript DOM2
1.Window.history:window.open打开网页的方式必须是_self window.history.back()后退 Window.history.forward()前进 <b ...
- ef延迟加载不到导航属性问题
最近做项目踩到了一个ef问题上的坑,导航属性(外键关键,如子表或主表等)“.”出来后是Null,外键值也对,数据库和ef的关系配置也都正确,就是加载不出来.后来发现实体里导航属性前少了个virtual ...
- Perl中的哈希(四)
Perl中的哈希数据结构.相比较于数组,这种数据结构对于数据查找和统计更加方便. 一个特殊的哈希,%ENV,表示当前terminal下,通过setenv设置的variable的键值. 键:环境变量名, ...
- Eclipse 启动项目错误:class not found
其中,很可能的原因:项目存在编译错误,根本没有编译成功,没有生成class文件:可查看problems标签页查看具体错误.
- Kintone学习
kintone JavaScript编码指南 编码的注意地方: 文字编码 使用 utf-8
- org.apache.catalina.core.StandardWrapperValve invoke的解决办法
org.apache.catalina.core.StandardWrapperValve invoke的解决办法 比较容易错的地方是页面带参数进行跳转,由于跳转之后的页面本身也要执行一部分sql语句 ...
- Kafka学习之(七)搭建kafka可视化服务Kafka Eagle
一.下载安装包 kafka-eagle-bin-1.2.4.tar.gz 百度云链接:链接:https://pan.baidu.com/s/1SNIkpsvs20A_Ljtx5PaMuA 密码:o4 ...
- WebService(JAX-WS、XFire、Axis三种)获取客户端ip
WebService(JAX-WS.XFire.Axis三种)获取客户端ip JAX-WS.XFire.Axis三种webservice的获取客户端IP的简单实现过程: 1,基于JDK6 jax-ws ...
- C++算法原理与实践(面试中的算法和准备过程)
第0部分 简介 1. 举个例子:面试的时候,可能会出一道算法考试题,比如写一个 strstr 函数——字符串匹配. 可能会想到用KMP算法来解题,但是该算法很复杂,不适宜在面试中使用. 1.1 C++ ...