糖果实验室杂货铺

Candy Lab

LUA中实现面向对象

2 years ago 0

我们引用云风大哥的代码:

None
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
local _class={}
 
function class(super)
 local class_type={}
 class_type.ctor=false
 class_type.super=super
 class_type.new=function(...) 
         local obj={}
         do
             local create
             create = function(c,...)
                 if c.super then
                     create(c.super,...)
                 end
                 if c.ctor then
                     c.ctor(obj,...)
                 end
             end
 
             create(class_type,...)
         end
         setmetatable(obj,{ __index=_class[class_type] })
         return obj
     end
 local vtbl={}
 _class[class_type]=vtbl
 
 setmetatable(class_type,{__newindex=
     function(t,k,v)
         vtbl[k]=v
     end
 })
 
 if super then
     setmetatable(vtbl,{__index=
         function(t,k)
             local ret=_class[super][k]
             vtbl[k]=ret
             return ret
         end
     })
 end
 
 return class_type
end

调用

None
1
2
3
4
5
6
7
8
9
10
11
12
13
14
base_type=class()        -- 定义一个基类 base_type
 
function base_type:ctor(x)   -- 定义 base_type 的构造函数
 print("base_type ctor")
 self.x=x
end
 
function base_type:print_x() -- 定义一个成员函数 base_type:print_x
 print(self.x)
end
 
function base_type:hello()   -- 定义另一个成员函数 base_type:hello
 print("hello base_type")
end

类继承

None
1
2
3
4
5
6
7
8
9
test=class(base_type)    -- 定义一个类 test 继承于 base_type
 
function test:ctor() -- 定义 test 的构造函数
 print("test ctor")
end
 
function test:hello()    -- 重载 base_type:hello 为 test:hello
 print("hello test")
end

再次调用

None
1
2
3
a=test.new(1)    -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x()  -- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello()    -- 输出 hello test ,这个函数被重载了。

http://blog.codingnow.com/cloud/LuaOO


糖果实验室

Openresty中文编程网
IKBC经典机械键盘
机械键盘领券优惠购买

Write a Comment