Lua中面向对象的实现

关于面向对象,Lua语言本身并没有提供面向对象编程的接口


而如果是进行2D游戏的开发,在cocos2dx 3.0中已经实现了lua的面向对象


但是如果在别的项目中,实际工程中需要在脚本中进行大量复杂的代码编写,可能会需要自己进行面向对象的实现


关于Lua实现面向对象的方法可以参考这篇 Step By Step(Lua面向对象),已经对于在Lua中面向对象的必要性以及原理进行了仔细的讲解


这里就直接给出一份能使用的面向对象的代码,这里的代码出自quick-cocos2dx,该团队现在也负责cocos2d的lua部分


这里的代码实现了类的创建以及类的继承


function class(classname, super)
    local superType = type(super)
    local cls

    if superType ~= "function" and superType ~= "table" then
        superType = nil
        super = nil
    end

    if superType == "function" or (super and super.__ctype == 1) then
        -- inherited from native C++ Object
        cls = {}

        if superType == "table" then
            -- copy fields from super
            for k,v in pairs(super) do cls[k] = v end
            cls.__create = super.__create
            cls.super    = super
        else
            cls.__create = super
            cls.ctor = function() end
        end

        cls.__cname = classname
        cls.__ctype = 1

        function cls.new(...)
            local instance = cls.__create(...)
            -- copy fields from class to native object
            for k,v in pairs(cls) do instance[k] = v end
            instance.class = cls
            instance:ctor(...)
            return instance
        end

    else
        -- inherited from Lua Object
        if super then
            cls = {}
            setmetatable(cls, {__index = super})
            cls.super = super
        else
            cls = {ctor = function() end}
        end

        cls.__cname = classname
        cls.__ctype = 2 -- lua
        cls.__index = cls

        function cls.new(...)
            local instance = setmetatable({}, cls)
            instance.class = cls
            instance:ctor(...)
            return instance
        end
    end

    return cls
end

在使用时,首先进行类的创建

local TestClass = class("TestClass")
-- 重写构造函数
function TestClass:ctor(a,b)	
	self.a = a
	self.b = b
end
-- TestClass的成员函数
function TestClass:setA(a) 
	self.a = a
end
function TestClass:returnA() 
	return self.a
end

实例的生成以及使用如下

testClass = TestClass.new(10,5) --这里会自动调用ctor函数,并把参数传入
testClass:setA(1)
testClass:returnA()

如果要继承TestClass类,只要这样写就行

local TestClassSon = class("TestClassSon",TestClass)


这里要注意“.”和“:”的使用,在Lua语言中

object:testFunc()
相当于

object.testFunc(object)

在testFunc函数内,用self取输入的object参数








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值