LuaClass类实现,已经函数重载

这篇文章资料来自于网络,对部分知识整理,这里只是记录一下,仅供参考。

LuaClass.lua

--[[
lua class
特性:
支持继承及多重继承
支持类型检测
支持构造函数
符合面向对象的的编程思维模式
继承关系复杂不再影响性能,但是失去了reload
]]


local ClassDefineMt = {}
function ClassDefineMt.__index( tbl, key )
	local tBaseClass = tbl.__tbl_Baseclass__
	for i = 1, #tBaseClass do
		local xValue = rawget(tBaseClass[i],key)
		if xValue then
			rawset( tbl, key, xValue )
			return xValue
		end
	end
end

        
function class( ... )
	local arg = {...}
    local ClassDefine = {}
    
    -- 这里是把所有的基类放到 ClassDefine.__tbl_Bseclass__ 里面
    ClassDefine.__tbl_Baseclass__ =  {}
    for index = 1, #arg do
    	local tBaseClass = arg[index]
        table.insert(ClassDefine.__tbl_Baseclass__, tBaseClass)
        
        for i = 1, #tBaseClass.__tbl_Baseclass__ do
        	table.insert(ClassDefine.__tbl_Baseclass__, tBaseClass.__tbl_Baseclass__[i])
        end
    end
    
    -- 所有对实例对象的访问都会访问转到ClassDefine上
    local InstanceMt =  { __index = ClassDefine }
    
    --  IsClass 函数提供对象是否某种类型的检测, 支持多重继承
    ClassDefine.IsClass = function(self, classtype)
        local bIsType = (self == classtype)
        if bIsType then
            return bIsType
        end
        
        for index=1, #self.__tbl_Baseclass__ do
            local baseclass = self.__tbl_Baseclass__[index]
            bIsType =  (baseclass == classtype)
            if bIsType then
                return bIsType
            end
        end
        return bIsType
    end
    
    --构造函数参数的传递,只支持一层, 出于动态语言的特性以及性能的考虑
    ClassDefine.new = function( self, ... )
    	local NewInstance = {}
    	NewInstance.__ClassDefine__ = self    -- IsType 函数的支持由此来
    
        NewInstance.IsClass = function( self, classtype )
            return self.__ClassDefine__:IsClass(classtype)
        end
        
        -- 这里要放到调用构造函数之前,因为构造函数里面,可能调用基类的成员函数或者成员变量
        setmetatable( NewInstance, InstanceMt )
        
      	local funcCtor = rawget(self, "Ctor")
    	if funcCtor then
    	    funcCtor(NewInstance, ...)
    	end
    	
    	return NewInstance
    end

    setmetatable( ClassDefine, ClassDefineMt )
    return ClassDefine
end


local bTestClass = false

if bTestClass then

	-- test case
	baseclass = class()
	
	function baseclass:Ctor(a,b,c)
	    print( "in baseclass Ctor : ", a, b, c)
	    
	    self.m_test = "baseclass member m_test"
	end
	function baseclass:print()
	    print "baseclass function print"
	end
	
	function baseclass:basseprint()
			print "basseprint"
	end
	
	--aaa = baseclass:new()
	
	dclass = class(baseclass)
	function dclass:Ctor(a,b,c)
			baseclass.Ctor(self, a,b,c)
	    print( "in dclass Ctor : ", a, b, c,d)
	    
	    
	    self:print()
	end
	
	function dclass:print()
	    print "dclass function print"
	end
	
	
	---obj = dclass:new(1,2,3)
	
	bclass2 = class()
	
	function bclass2:Ctor()
	    print "bclass2:Ctor()"
	end
	
	function bclass2:print()
	    print "bclass2 function print"
	end
	
	dclass2 = class(bclass2,dclass)
	
	function dclass2:Ctor()
		bclass2.Ctor(self)
	  dclass.Ctor(self)
	end
	
	--[[function dclass2:Ctor()
	    print "dclass2:Ctor"
	    
	    self:print()
	end]]
	
	ooo = dclass2:new()
	--ccc = class()
	ddd = bclass2:new()
	eee = dclass:new()
	
	--print("ooo is  dclass2", ooo:IsClass(dclass2))
	--print("ooo is bclass2", ooo:IsClass(bclass2))
	--print("ooo is dclass", ooo:IsClass(dclass))
	--print("ooo is baseclass", ooo:IsClass(baseclass))
	--print("ooo is ccc", ooo:IsClass(ccc))
	--print("ddd is baseclass", ddd:IsClass(baseclass))
	--print("eee is dclass2", eee:IsClass(dclass2))
	
	print("cp test begine1")
	ooo:basseprint()
	print("cp test end1")
	
	print("cp test begine2")
	ooo:basseprint()
	print("cp test end2")

end


CharacterInc.lua :

CFighter        = class()
CCharacter      = class(CFighter)

CFighter.lua

function CFighter:Ctor(nGlobalId)
    self.m_nGlobalId = nGlobalId
    self.m_nLevel = 0
    self.m_nPartPai= 0
    self.m_sName = ""
    self.m_nSex = 0
    self.m_nCurHP = 0
    self.m_nMaxHP = 0
    self.m_nCurMP = 0
    self.m_nMaxMP = 0
    self.m_nCurXP = 0
    self.m_nMaxXP = 0
    self.m_nCamp = 0
    
    self.m_oMixStateMgr = CGacMixStateMgr:new(self)
end


function CFighter:SetMaxMP(nMaxMP)
    self.m_nMaxMP = nMaxMP
end
function CFighter:GetMaxMP()
    return self.m_nMaxMP
end
function CFighter:SetCurMP(nCurMP)
    self.m_nCurMP = nCurMP
end
function CFighter:GetCurMP()
    return self.m_nCurMP
end

function CFighter:SetLevel(nLevel)
    self.m_nLevel = nLevel
end

function CFighter:SetPartpai(nPartpai)
    self.m_nPartPai= nPartpai
end

function CFighter:SetName(sName)
    self.m_sName = sName
end

function CFighter:SetSex(nSex)
    self.m_nSex = nSex
end


CCharacter.lua :

function CCharacter:Ctor(nGlobalId, bMainPlayer)
    CFighter.Ctor(self, nGlobalId)

    self.m_bMainPlayer = bMainPlayer or false
    self.m_oScene = nil

    self.m_bIsMove = false 
    self.m_bIsDeath = false
    self.m_bVisible = true
    self.m_nSpeed = 200
    self.m_uSrcSpeed = self.m_nSpeed
    
    self.m_nGridX = 0
    self.m_nGridY = 0
    self.m_nPixelX = 0
    self.m_nPixelY = 0
    self.m_nAngle = 0
end


function CCharacter:GetDeath()
    return self.m_bIsDeath
end

function CCharacter:OnDead()
    CFighter.OnDead(self)
    self:SetDeath(true)
end

function CCharacter:SetDeath()
    --Todo:
end
--重载
function CCharacter:AddCurHP(nAddHP)
    CFighter.AddCurHP(self, nAddHP)  --调用CFighter函数
    if self.m_oRenderObj then
        self.m_oRenderObj:OnChangeHp(self:GetCurHP(), self:GetMaxHP())    
    end
end
--重载
function CCharacter:SetCurHP( nValue )
    CFighter.SetCurHP(self, nValue)
    if self.m_oRenderObj then
        self.m_oRenderObj:OnChangeHp(self:GetCurHP(), self:GetMaxHP())
    end
end

function CCharacter:SetMaxHP( nValue )
    CFighter.SetMaxHP(self, nValue)
    if self.m_oRenderObj then
        self.m_oRenderObj:OnChangeHp(self:GetCurHP(), self:GetMaxHP())
    end
end

function CCharacter:OnDestroy(bFadeOut)
    CFighter.OnDestroy(self)
    if self.m_nChargeTickId then
        LuaTick.UnRegisterTick(self.m_nChargeTickId)
        self.m_nChargeTickId = nil
    end
end

CCharacter重载CFighter类,并重写了同名函数。CCharacter的重载函数内部调用了CFighter类的同名函数,并在CCharacter中进行了自己的单独处理。

CCharacter可以直接调用CFighter类的其他没有重载的函数,比如:

CCharacter  palyer

player.SetName(sName)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值