Luaオブジェクト向けの実装方法

7024 ワード

Lua実装オブジェクト向けメソッドは,大きく分けて以下の2つの方法に分けられる.

方法1:


公式のやり方:
実装クラス:
    local Class= { value=0 }

    function  Class:new(o)
         o=o or {};
         setmetatable(o,self);
         self.__index=self;
         return o;
    end

    function  Class:showmsg()
        print(self.value);
    end

    local  test = Class:new();
    test:showmsg();

次に上に継承を実現
    local  A = Class:new();

    function  A:new(o)
          local  o = o or {};
          setmetatable(o,self);
          self.__index=self;
          return o;
    end
    function  A:showmsg(  )
        print (self.value);
        print("zhishi   ")
    end

    local  s = A:new({value=100});
    s:showmsg();

結果:
0
100
zhishi   

方法2


より優雅な実現方法:
class.luaコード:

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

次に使用します.
クラスを定義します.
test=class()       --   base_type
function test:ctor(x)  --   base_type  

    print("test ctor")

    self.x=x

end
function test:print_x()    --   test:print_x

    print(self.x)

end
function test:hello()  --   test:hello

    print("hello test")

end


-- 

test.new(1);
test:print_x();
test:hello();

継承の実装:
base=class()       --   base_type
function base:ctor(x)  --   base_type  

    print("base ctor")

    self.x=x

end
function base:print_x()    --   base:print_x

    print(self.x)

end
function base:hello()  --   base:hello

    print("hello base")

end



-- 
child=class(base);
function child:ctor()
    print("child ctor");
end

function child:hello()
     print("hello child")
end


-- 
 local a=child.new(21);
 a:print_x();
 a:hello();

2つの方法はそれぞれ長所と短所があって、自分を見て、分からないところに伝言を残して交流します..