lua实现多继承

lua对于面向对象的支持主要通过table来实现,每个table都是一个对象,对于继承,lua有元表的机制,通过setmetatble()可以来修改元表,

元表是什么?

元表其实就是在本身找不到的东西,就会去元表中查找。

__index元方法:

__index方法是用来确定一个表在被作为元表时的查找方法。它的值可以使函数也可是是table,一般用法为:


local obj = {}
setmetatable(obj, {__index = xx})   --这样便实现了obj实现继承自xx。

对于多继承,原理就是遍历多个父类的,代码如下:



local class1 = {}
function class1:new()
    local obj = {}
    setmetatable(obj, {__index= class1})
    return obj
end

function class1:print1()
    print("class1:print()")
end

local class2 = {}
function class2:new()
    local obj = {}
    setmetatable(obj, {__index= class2})
    return obj
end

function class2:print2()
    print("class2:print()")
end

function super(k, list)
    for i,v in ipairs(list) do
        local ret = v[k]
        if ret then
            return ret
        end
    end
end

local class3 = {}
function class3:new()
    local obj = {}
    local  base = {class1, class2}
    --t为调用的对象,k为方法名
    setmetatable(class3, {__index= function(t,k) return super(k, base) end})
    setmetatable(obj, {__index = class3})
    return obj
end

结果输出:

class1:print()

class2:print()

时间: 2024-12-09 08:07:47

lua实现多继承的相关文章

lua中的继承

做为一个java出身的程序媛,长时间做Lua,重复一些工作后,特别想用继承.其实很简单.因为我有一大部分的场景,背景长的都一样,所以打算做一个父类. 需要注意的是,如果子类有和父类的同名函数,就会被覆盖,除非手动的调用.super.方法. 关键的代码就两个地方,都在子类中. 1 创建场景时: local SceneBase = import("app.scenes.SceneBase") local ActivityScene = class("ActivityScene&q

Lua 学习之基础篇八<Lua 元表(Metatabble)&&继承>

讲到元表,先看一段table的合并动作. t1 = {1,2} t2 = {3,4} t3 = t1 + t2 attempt to perform arithmetic on a table value (global 't1') 程序会报错,因为不知道如何对两个table执行+运算,这个时候就需要通过元表来定义,有点类似c中的运算符加载.我们看一下如何通过元表实现合并操作. local mt = {} --定义mt.__add元方法(其实就是元表中一个特殊的索引值)为将两个表的元素合并后返回

Lua下通过元表模拟OOP编程,继承多态

Lua本身是没有以明确的定义来支持OOP编程的,但是我们却可以通过Lua内核提供的一些特性来间接实现简单的面向对象的编程. 通过Lua中的 table结构  metatable 以及函数可以配合实现OOP,以及继承.这些说白了都是一种伪实现,不建议在Lua下使用多重继承 . 在LUA中你想要 强制实现OOP 你必须需要懂一下几个关键词!! 什么是语法糖? 语法糖即糖衣语法,C/C++升级过程中的面向对象 整体就是一种语法糖 ,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)

Cocos2d-x 脚本语言Lua中的面向对象

Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义.但相同在Lua中能够利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 --Lua中的面向对象 --[[ 复制表方式面向对象 參数为一张表.通过遍历这张表取值,赋给一张空表,最后返回新建的表.来达到克隆表 ]] function clone(tab) local ins =

[Android]继承式UI界面布局设计

一般而言,Android界面布局使用聚合的方式比较多,这种方式要求首先构建一批能够复用的组件,然后在Activity的布局文件中进行聚合.尽管这种方式能够完成组件的复用,但如果这些组件在不同Activity中的布局有很多相同点的时候,也还是会带来很大程度的冗余(代码).本文介绍一种比聚合更加有效的界面布局方式--继承式布局. 对于类的继承和对象的聚合之间有哪些相同点和不同点,分别适用于哪种场景,相信大家已经深有体会.在此就不多讲了.其实类比过来,Android的界面布局也是如此.假设我们需要实现

Lua 安全调用 metatable 的简单应用

事情的经过 我们的项目中存在好几个战斗界面,不过界面中的内容略有不同.跟同事出去吃饭的时候,他问我.我们现在的战斗界面.有很多是重复的,但是也有偶尔几个地方不太一样.我在战斗过程中驱动这些界面的时候.还需要判断一下有没有这个函数,然后在选择调用它.比较麻烦,你说怎么样才能更好的规划这件事情呢?我第一个想到的就是抽离出来一个UI的父层对象.然后父层对象实现所有的函数.然后让父层函数hook住具体的页面.然后判断具体的页面究竟有没有这个函数,如果存在这个函数那么调用,否则什么都不做就行了.不过,我突

lua总则

lua官方英文文档:http://www.lua.org/manual/5.2/ lua中国开发者网址:http://bbs.luaer.cn/ [转]Lua 编程技巧 Lua 的 5.1 版本已经正式发布.现在,我们应该把全部讨论放在这个版本上. 应该尽量使用 local 变量而非 global 变量.这是 Lua 初学者最容易犯的错误.global 变量实际上是放在一张全局的 table 里的.global 变量实际上是利用一个 string (变量名作 key) 去访问这个 table .

[转]Lua中的面向对象实现方法

面向对象不是针对某一门语言,而是一种思想,在面向过程的语言也可以使用面向对象的思想来进行编程.在Lua中,并没有面向对象的概念存在,没有类的定义和子类的定义,但同样在Lua中可以利用面向对象的思想来实现面向对象的类继承. 一.复制表的方式面向对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

Lua的面向对象——多重继承、私密性

本文转载于:http://www.benmutou.com/archives/1800 在Lua中的多重继承和私密性可能用得比较少,也可能只是我个人用得比较少. 本来想偷懒不写这文章的,因为我今天刚买了个漂移板,连起步都还没学会啊,想多学一会. 咳咳,本着坚持不懈.负责到底的态度,我还是决定随便写几句~(小若:随便写几句是几吨意思啊?!) 1.多重继承之在多个类中查找一个字段 我发现这些高(shen)智(jing)商(bing)人群真的很厉害,这种技巧都能想到,很佩服. 其实多重继承没什么特别的