Lua面向对象之三:其它一些尝试
1.尝试一:子类对象调用被覆盖了的父类函数
根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了
①在子类Circle中增加一个调用父类方法的函数
- --调用父类被子类覆盖了的name方法
- function Circle:sharp_name()
- local circle_metatable = getmetatable(self)
- local sharp_metatable = getmetatable(circle_metatable)
- sharp_metatable["name"]()
- end
②调用结果(完全正确)
2.尝试二:不使用全局表作为元表
①在上两篇中,使用全局表作为元表:
下图是父类以Sharp作为元表
下图是子类以Circle作为元表
②修改元表过程
将Sharp的创建函数修改为
- function Sharp:new()
- local new_sharp = { }
- local metatable = {}
- metatable.__index = self --②,self == Sharp
- setmetatable(new_sharp, metatable) --③ 使用metatable作为元表
- return new_sharp
- end
将Circle的创建函数修改为
- function Circle:new()
- local new_circle = {}
- local metatable = {}
- metatable.__index = self --②,self == Circle
- setmetatable(new_circle, metatable) --③使用metatable作为元表
- return new_circle
- end
③调用函数
- local circle = Circle:new()
- circle._val = --覆盖赋值
- circle:sharp_func() --调用父类函数
- circle:circle_func() --调用新函数
- circle:name() --调用覆盖函数
- circle:val() --调用覆盖函数
- local circle_2 = Circle:new()
- circle_2._val =
- circle_2:val()
- circle:val() --再次调用测试
④输出结果(完全正确)
⑤这时候调用被子类覆盖的父类函数就需要修改为
- --调用父类被子类覆盖了的name方法
- function Circle:sharp_name()
- local circle_metatable = getmetatable(self)
- local sharp_metatable = getmetatable(circle_metatable.__index)
- sharp_metatable.__index["name"]()
- end
⑥输出结果(完全正确)
Lua面向对象:
Lua面向对象之三:其它一些尝试的更多相关文章
- Lua面向对象之二:类继承
1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...
- Lua面向对象之一:简单例子
1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法) __index 赋值其实是一个fun ...
- Lua面向对象----类、继承、多继承、单例的实现
(本文转载)学习之用,侵权立删! 原文地址 http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&a ...
- lua面向对象封装
lua面向对象的一个封装,直接贴代码 --swfclass = {};local cs = {};function _class( child, base, ... )-- _.s( child ...
- lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)
lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...
- Step By Step(Lua面向对象)
Step By Step(Lua面向对象) Lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,见如下代码: 1 Account = {balance = 0}2 function ...
- lua 面向对象
对象的特点是: 对象拥有自己的数据,两个对象即使数据完全相同,他们也是相互独立的: 对象之间可以共享对象的行为,也就是他们的方法是一致的: lua中的table就非常适合作为一个对象,可以在table ...
- Lua面向对象
lua中的table就是一种对象,但是如果直接使用仍然会存在大量的问题,如下: 1 Account = {balance = 0}2 function Account.withdraw(v)3 Acc ...
- Lua面向对象设计
首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...
随机推荐
- Golang字符串解析成数字
package main import ( "strconv" "fmt" ) func main() { // 使用ParseFloat解析浮点数,64是说明 ...
- django ORM聚合函数
在Django中,聚合函数是通过aggregate方法实现的,aggregate方法返回的结果是一个字典 在使用时需要先导入模块from django.db.models import Count,A ...
- log buffer space等待事件
最近,我们有台服务器在delete操作期间发现一直在等待log buffer space,其他节点就没与这个问题.经查,向重做缓冲区上写入重做记录的进程,为了确保拥有重做缓冲区内必要的空间,需要获得r ...
- Intellij IDEA搭建vue-cli项目
1.安装/升级node环境 vue-cli对于node和npm的版本是有要求的. 可以通过 node -v (npm -v)查看当前版本,通过 where node (where npm)查看 ...
- 05: greenlet:轻量级的并发编程
网络编程其他篇 1.1 greenlet简介 1.greenlet原理 & 使用 1. greenle间切换 1)一个 “greenlet” 是一个很小的独立微线程,可以把它想像成一个堆栈帧, ...
- Android之RadioButton多行
RadioGroup设置orientation="vertical"竖向单列显示 RadioGroup设置orientation="horizontal"横向单 ...
- Codeforces 750E New Year and Old Subsequence - 线段树 - 动态规划
A string t is called nice if a string "2017" occurs in t as a subsequence but a string &qu ...
- 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统
参考: http://blog.csdn.net/statdm/article/details/7756788 参考: http://www.cnblogs.com/fengbohello/p/488 ...
- luogu1975 [国家集训队]排队
思路 序列中 |i | 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| |----|--|--|--|--|--|--|--|--|--|--| |a[i]| a| b| c| L| d ...
- 密码发生器|2012年蓝桥杯B组题解析第八题-fishers
(10')密码发生器 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现 ...