Luaオブジェクト向けの実装方法
7024 ワード
Lua実装オブジェクト向けメソッドは,大きく分けて以下の2つの方法に分けられる.
公式のやり方:
実装クラス:
次に上に継承を実現
結果:
より優雅な実現方法:
class.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つの方法はそれぞれ長所と短所があって、自分を見て、分からないところに伝言を残して交流します..