Simple Code, Simple OO
295 行代码,实现 Lua 下的 OO[quote]将 oo.rar 内文件解压缩到 lua 目录,运行 lua 命令行
x:\xxx\xxx\xxx>lua.exe
Lua 5.1.2 Copyright (C) 1994-2007 Lua.org, PUC-Rio
> dofile('oo.lua')
> dofile('test.lua')
-- Const Sample
输出存在的值 v.aaa : [aaa]
输出不存在的值 v.ccc : [nil]
不能改变 const 的值
** Error [test.lua:10: cannot change const variable]
不能改变 const 的 metatable
** Error [test.lua:14: cannot change a protected metatable]
-- Interface Sample
声明接口 a
声明接口 a 的方法 testa
接口声明的严格性,只能赋值 nil
** Error [test.lua:24: interface method defined error]
声明接口 b
声明接口 b 的方法 testb
声明接口 c,继承接口 a, b
声明接口 c 的方法 testc
声明接口 d,继承接口 b
-- Class Sample
声明类 base
声明类 base 的构造函数
声明类 base 的方法 test
实例化 base 对象 o,构造函数传参 [base]
##### base:__ctor - 初始化对象,生成变量 base
调用对象 o:test
##### base:test [self.base] = [base]
声明类 derive 继承类 base 实现接口 c, b
声明类 derive 调用父类构造函数时的参数
声明类 derive 构造函数
声明类 derive 的方法 test,覆盖 base:test
实现接口 c 的方法 testc
声明类 other
实例化 derive 对象 o,构造函数传参 [derive]
##### base:__ctor - 初始化对象,生成变量 base
##### derive:__ctor - 初始化对象,生成变量 derive
调用对象 o:test
##### derive:test [self.derive] = [derive] [self.base] = [(from derive:derive)]
##### derive:test 调用父类函数 base:test()
##### base:test [self.base] = [(from derive:derive)]
调用未实现的接口 b 方法 o:testb
** Error [test.lua:82: interface function does not implement]
调用已实现的接口 c 方法 o:testc
##### derive:testc
o:instanceOf Sample
o 是类 dervie 的实例 [true]
o 是类 base 的实例 [true]
o 不是类 other 的实例 [false]
o 实现了接口 c [true]
o 实现了接口 b [true]
o 实现了接口 a [true]
o 未实现接口 d [false]
声明类 son 继承 derive
声明类 son 调用父类构造函数时的参数
声明类 son 的方法 test,覆盖 derive:test
类 son 未定义构造函数
实例化 son 对象 p
##### base:__ctor - 初始化对象,生成变量 base
##### derive:__ctor - 初始化对象,生成变量 derive
refDervie = 切片对象 p 至类 dervie
调用 refDervie:test()
##### derive:test [self.derive] = [{son}] [self.base] = [(from derive:{son})]
##### derive:test 调用父类函数 base:test()
##### base:test [self.base] = [(from derive:{son})]
refBase = 切片对象 p 至类 base
调用 refBase:test()
##### base:test [self.base] = [(from derive:{son})]
只能将类切片至父类
** Error [test.lua:119: Object isnot instance of class]
不能将对象 切片至 接口
** Error [test.lua:123: cannot clip object to interface]
对象 与 对其切片后的引用对象之间的 相等判断
p == refBase : true
p == refDervie : true
切片引用对象间的 相等判断
refDervie == refBase : true
从切片引用对象得到对象本身,调用 son:test()
##### son:test
##### son:test 调用父类函数 dervie:test()
##### derive:test [self.derive] = [{son}] [self.base] = [(from derive:{s
on})]
##### derive:test 调用父类函数 base:test()
##### base:test [self.base] = [(from derive:{son})]
>[/quote] 关于对象切片 ref = object:super(base) 的说明
[quote]当前所实现的对象切片(或者叫 上溯造型)于通常的OO语言有所不同
通常OO语言中:
将对象上溯造型后,执行 ref.method(...),将等同于 object.mothod(...)。
在函数中调用父类函数,以C++为例:base::method(...),实际上编译器在后台做了很多工作以使得正确的父类函数被调用。
本 Lua OO 实现中:
将对象切片后(上溯造型),得到对象 Object 的一个引用对象 ref,ref 被强制完全切片至类 base。当调用 ref:method(...) 时,等同于调用 base.method(object, ...)。因此,在函数内需要调用父函数时,必须指明要切片至哪个父类:ref = object:super(base),base 不能缺少。否则会引起意外的结果。
在普通执行代码中,使用 object:super() 将得到 object 的切片引用对象,该对象被上溯造型至其直接父类。ref:super() 将得到 对象父类的父类的切片引用对象。举例如下:
a = new:Class()
b = new:Class(a)
c = new:Class(b)
c:super():super() = c:super(a) -- 结果是 true[/quote]
页:
[1]