通过__index实现创建子类对象
来源:互联网 发布:中美合作 规范网络 编辑:程序博客网 时间:2024/05/01 07:20
通过设置Window的__index事件(返回自身pro的table值),在设置.new的时候。为了避免每次创建对象的时候传递self。可以写成
Window.new = function(...)--setmetatable(o, Window.mt)--这里可以注册方法return setmetatable(Window, {__index = _class[Window]})end
这样每次我们就可以直接使用.new来创建。
在这里实现了对象的实例,但是还未实现继承。
完整的OOP
local _class = {}class = function(super)local Window = {}Window.prototype = {x = 0, y = 0, width = 100, height}--Window.mt = {}Window.new = function(...)--setmetatable(o, Window.mt)--这里可以注册方法return setmetatable(Window, {__index = _class[Window]})end--Window.mt.__index = function (t, key)--return Window.prototype[key]--endlocal vtbl = {}_class[Window] = vtblsetmetatable(Window, {__newindex =function(t,k,v)vtbl[k] = vprint("enter base")end--,--__index = vtbl,})if super thenprint("enter super")setmetatable(vtbl, {__index =function(t,k)local ret = _class[super][k]vtbl[k] = retprint("enter ")return retend})endreturn Windowend
要实现继承父类,我们参照c++的编码习惯,为class传递一个参数。通过_class保存每一个基类的信息。每次创建基类的时候通过newindex方法添加基类的成员函数和数据,如果没有相对应newindex不会被调用。 创建子类的时候,通过index把对应基类的信息返回到子类对象。为了实现及时更新,我们应该在创建__newindex方法的时候对虚表进行自身索引,这样子类就可以在它的元方法index里面找到父类的成员函数。 为了在子类创建的对象可以默认调用父类的构造函数的成员数据,我们需要在.new里面加载基类的方法。类似
--Window.mt.__index = function (t, key)--return Window.prototype[key]--end通过这个元表事件,调用在prototype里面对应key的value。
0 0
- 通过__index实现创建子类对象
- Lua笔记19 面向对象实现__index
- 通过创建Cell子类,来实现自定义Cell
- 子类创建对象
- 子类对象的创建过程
- 创建子类对象的调用顺序
- 子类创建对象时内存分配解析
- 通过反射创建对象?
- VC6下如何实现通过字符串创建对象
- 创建fragment的基类让子类实现
- 通过父类对象指针发送子类自定义消息
- Java反射:通过父类对象调用子类方法
- ios 通过runtime 获取类对象的所有子类
- 创建FileGeodatabase,创建要素类,创建域对象,创建子类,创建要素
- Java通过反射创建对象
- 通过配置文件动态创建对象
- 通过JavaScript创建Qml对象
- Java通过反射创建对象
- JSP确定文件路径方法
- splay bzoj1251序列终结者
- mahout学习进度
- Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
- Extjs之自动消失提示框(Ext.example.msg)
- 通过__index实现创建子类对象
- Mistserver 介绍 - 一个轻量级高可扩展性的媒体服务器
- UVa:11732 strcmp() Anyone?
- 什么样的列使用索引?
- 没有文件扩展 vbs 的脚本引擎 解决方案
- [数论]HOJ 1991 Happy 2005
- 正则读写文件匹配
- 网站建设的原则及要点
- 写给未来的妻子