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:代码块分类 根据其位置和声明的不同,可以 ...
随机推荐
- ajax提交form(文本数据以及文件上传)
$.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...
- [转]mac上安装android sdk
一.先下载android sdk for mac 给二个靠谱的网址: a). http://down.tech.sina.com.cn/page/45703.html b). http://mac.s ...
- 【tensorflow】pip 安装失败的原因
linux系统旧版本: pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27- ...
- python 操作 hbase
python 是万能的,当然也可以通过api去操作big database 的hbase了,python是通过thrift去访问操作hbase 以下是在centos7 上安装操作,前提是hbase已经 ...
- SNMP学习笔记之Linux下安装和配置SNMP
注意:本篇安装用户是root,非root用户启动的时候会报缺少文件错误. 一.安装SNMP 1.1.下载Net-SNMP的源代码 选择一个SNMP版本,比如5.7.1,下载地址如下:http://so ...
- 20145334赵文豪 WEB基础实践
实验问题回答 1.什么是表单 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框.隐藏域.多行文本框.复选框.单选框.下拉选择框和文件上传框等 表单 ...
- 20145319 《网络渗透》URL攻击
20145319 <网络渗透>URL攻击 实验步骤 首先启动apache2,打开我们的钓鱼网页,键入命令/etc/init.d/apache2 start 在浏览器中尝试着访问自己的ip地 ...
- C++使用TinyXML
参照一:http://qaohao.iteye.com/blog/496237 参照二:http://hi.baidu.com/lnylvoeegzcgnrr/item/af68fd9cde40fc1 ...
- Python3基础 str lstrip 去掉字符串左边的空格
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Linux内核分析--内核中的数据结构双向链表【转】
本文转自:http://blog.csdn.net/yusiguyuan/article/details/19840065 一.首先介绍内核中链表 内核中定义的链表是双向链表,在上篇文章--libev ...