CWDG论坛-专业魔兽插件's Archiver

cosin0002 发表于 2007-9-11 15:29

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]

cosin0002 发表于 2007-9-12 14:58

关于对象切片 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]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.