lua 面向对象的实现及原理

--[[
function func( ... ) -- 对于不定参数的使用
local args = {...}
for k,v in ipairs(args) do
print(v)
end
end
func(1,2,"ssa",6)
]]--


-- 面向对象实现


TSprite = {
x = 0,
y = 0
}
-- 使用点操作符,需要显示的传参数self
function TSprite.setPosition(self,x,y)
self.x = x;
self.y = y;
end


local spr = TSprite;
TSprite = nil;
print(spr.x)
print(spr.y)
spr.setPosition(spr,10,20)
print(spr.x)
print(spr.y)


-- 使用冒号方法,不用显式的插入self
function spr:setPosition(x,y)
self.x = x;
self.y = y;
end
spr:setPosition(100,200)
print(spr.x)
print(spr.y)




-- 实现继承 (添加构造函数--类似继承)
Hero = {
attack = 10;
}


function Hero:new(o)
o = o or {} -- o为true则为o,若false则创建一个新表
setmetatable(o,self);--将子类作为元表插入
self.__index = self; --设置子类表即为子类的元方法这样可以实现子类字段的添加
return o;
end


function Hero:addAttack(addAttack)-- 添加成员方法
self.attack = self.attack + addAttack;
end
function Hero:Injure(loseAttack)-- 添加成员方法
self.attack = self.attack - loseAttack;
end
hero = Hero:new({})-- 构造过程 (实现了继承)
--hero = Hero:new({attack=1000}) -- key值作为成员变量名,value值为变量值
hero:addAttack(100)
print(hero.attack)




-- 多继承 
Sprite = {}; --父类 A
function Sprite:hello()
print("hello");
end
function Sprite:new(o)
o = o or {};
setmetatable(o,self)
self.__index = self;
return o;
end
Bullet = {};-- 父类 B
function Bullet:fire()
print("fire");
end
function Bullet:new(o)
o = o or {};
setmetatable(o,self);
self.__index = self;
return o;
end
-- 继承父类A,父类B
--首先要创建一个要用到的函数 在多表中查询某个字段
function search(classes,key)
for i=1,#classes do
local value = classes[i][key]
if value ~= nil then 
return value;
end
end
end
-- 然后创建一个继承多个类的子类的方法
function createClass( ... )
local parents = {...}; -- 此处用到了不定参数
local child = {} --子类
setmetatable(child,{-- 设置元表
__index = function (table,key)
return search(parents,key)
end
});
function child:new(o)
o = o or {};
setmetatable(o,child);
child.__index = child;
return o;
end
return child;
end


-- 测试多继承
local bullet_spr = createClass(Bullet,Sprite)
local bs = bullet_spr:new();
bs.hello() --hello

bs.fire()   -- fire



-- 实现封装  返回一个表,“私有的”不添加到表中,达到访问不到的效果
function createTSprite()
local self = {name="myname"}
local function mybus()
print("my bus is private")
end 
local function mygame()
print("my game is private")
end 


local function hello()
print("hello")
mybus();
end


local function hi()
print("hi")
mygame();
end


local function getname()
return self.name
end
local function setname(newname)
self.name = newname;
end 
return {hello =hello,hi=hi,setname =setname,getname =getname}--实现封装
end


local ts = createTSprite();
ts.hello();
ts.hi();


-- ts.mybus() -- 不能调用
-- ts.mygame()


ts.setname("xiaoming")
print(ts.getname())






-- 弱引用
t={}
setmetatable(t,{__mode="k"})
key1 = {name = "key1"}
t[key1] = 1;
key1 = nil
key2 = {name = "key2"}
t[key2] = 1;
key2 = nil


-- 强制垃圾回收


collectgarbage()


for k,v in pairs(t) do
print(k,v)
print(k.name)
end

你可能感兴趣的:(cocos2dx-Lua,Quick)