lua中class的一种实现方式,单例扩充

 

先上代码

 

 1 local _class={}
 2  
 3 function class(super,singleton)
 4     local class_type={}
 5     class_type.ctor=false
 6     class_type.super=super
 7     class_type.new=function(...) 
 8             local obj={}
 9             do
10                 local create
11                 create = function(c,...)
12                     if c.super then
13                         create(c.super,...)
14                     end
15                     if c.ctor then
16                         c.ctor(obj,...)
17                     end
18                 end
19  
20                 create(class_type,...)
21             end
22             setmetatable(obj,{ __index=_class[class_type] })
23             return obj
24         end
25     if singleton then
26         class_type.instance = singleton
27         class_type.Instance = function()
28             if class_type.instance==true then                
29                 class_type.instance = class_type.new()
30             end
31             return class_type.instance
32         end
33     end    
34     local vtbl={}
35     _class[class_type]=vtbl
36  
37     setmetatable(class_type,{__newindex=
38         function(t,k,v)
39             vtbl[k]=v
40         end
41     })
42  
43     if super then
44         setmetatable(vtbl,{__index=
45             function(t,k)
46                 local ret=_class[super][k]
47                 vtbl[k]=ret
48                 return ret
49             end
50         })
51     end
52  
53     return class_type
54 end

想在lua项目中添加单例, class的核心部分是借鉴的云风大神的代码,由于实用了newindex元方法对类的赋值进行拦截并将vtbl方法集保存到_class中。所以没法像之前习惯的方式添加class.Instance对类添加方法。所以在class中通过提前定义Instance的方式添加了单例的支持(类似于提前定义的ctor)

在这个class实现中。类本身只提供new,ctor方法实现创建实例和构造方法,super指向父类

使用newindex元方法拦截所有对类的赋值(方法集),赋值到类的原表中,并将vtbl方法集保存在_class中 用类名class索引 。并且在类进行new 实例化的时候。把实例的原表index方法指向之前保存的vtbl

如果父类存在,就用类本身的vtbl的index元方法去索引父类中是否存在 如果存在copy给子类使用,避免冗余

posted on 2018-12-11 20:29  沉沦Meteor  阅读(204)  评论(0)    收藏  举报

导航