(原创)cocos2d-x 3.0+ lua 学习和工作(2) : 单一继承简单介绍

-- 星月相随倾心贡献~~~

-- 本章简单介绍一下:单一继承
-- 多继承本人还没有用过,主要是lua多继承感觉不好用~~~个人感觉~~~大汗~!

-- example:
    local Base = class( "Base" )
    Base.__index = Base

    function Base:ctor(...)
        print( self.__cname )  -- 输出:类名字。class( "xxx" ), self._cname 就是 xxx
    end

    function Base:init(...)
        print( "Base:init" )
    end    

    return Base

    -- 继承
    local Test = class( "Test", require "Base" )
    Test.__index = Test

    return Test

    -- 创建对象
    createInst( "Test" )

    -- 输出:
    -- Test
    -- Base:init

    -- 创建对象时,new()会自动调用ctor(...)函数,查找Test没有找到这个方法,则查找父类Base,找到方法ctor(...),调用。self.__cname是class( "XXX" )的XXX内容,这里是Test,为什么不是Base,因为对象是Test,汗~大家可以自己研究下!
    -- 同样的,调用init(...)方法。这里不再描述~~~

-- 在Test中增加ctor(...)方法,Base不变
    function Test:ctor(...)
    end

    -- 创建对象
    createInst( "Test" )

    -- 输出:
    -- Base:init

    -- 这次没有输出:Test。
    -- 原因:Test:ctor(...)方法覆盖了父类的ctor(...)方法,new()调用的是子类的ctor(...)方法。(坑~~~~)

-- 怎么让子类调用父类呢??
-- 改变Test中ctor(...)方法,Base不变
    function Test:ctor(...)
        self.super.ctor( self, ... )   -- 调用父类的方法
    end

    -- 在class中用self.super保存父类,这样self.super就是父类,self.super.ctor( self, ... )就是调用父类的ctor(...)方法。

    -- 创建对象
    createInst( "Test" )

    -- 输出:
    -- Test
    -- Base:init

-- 为什么self.super.ctor( self, ... )使用 "." 符号调用方法ctor,并且还把self传入了。

-- 不急
-- 首先,我们研究为什么用 "." 符号。
-- 改变Test中ctor(...)方法,Base不变
    function Test:ctor(...)
        self.super:ctor( ... )   -- 调用父类的方法, 注意:参数没有self
    end

    -- 创建对象
    createInst( "Test" )

    -- 输出:
    -- Base           -- 注意:这里输出变了
    -- Base:init

    -- 使用符号 ":" ,那么在ctor(...)中的self是self.super,即这时的self是Test的父类。

--  lua中 "." 和 ":" 的区别
    function a:t( k )
        a._t = k
    end
    a:t( 5 )  -- 会隐示的传递参数 a ,self = a
    a.t( a, 5 )  -- 会自动把第一个参数设置为self, self = a

-- 所以:
    self.super:ctor( ... )  --  参数是:self.super,即Base
    self.super.ctor( self, ... )  -- 参数是:self,即Test

-- ( 好坑~~~~~~~~~~~~~ )

-- 完整代码:
    local Base = class( "Base" )
    Base.__index = Base

    function Base:ctor(...)
        print( self.__cname )  -- 输出:类名字。class( "xxx" ), self._cname 就是 xxx
    end

    function Base:init(...)
        print( "Base:init" )
    end    

    return Base

    -- 继承
    local Test = class( "Test", require "Base" )
    Test.__index = Test

    function Test:ctor(...)
        self.super.ctor( self, ... )
    end

    function Test:init(...)
        self.super.init( self, ... )
    end    

    return Test

-- 时间有限,希望对各位有帮助~

-- 顺便提一句:coco2d-x 继承layer写法

    local t = class( "t", function ()
        return cc.Layer.create()    --  继承layer
    end )

-- lua我也是初学者,所以有些地方可能写的不好,或者有更好的方法去实现,希望各位能多多指教,多多指导,星月会努力改进!!!

-- 感谢各位花时间阅读本人的作品,谢谢~~~祝各位都能大展宏图,万事顺利~~~下一章节见~~~~

作者使用 cocos2d-x 3.0 + lua学习和工作心得,未经作者允许,请勿转载!在此谢谢各位手下留情~~~

本文没有获得作者本人同意,不得转载,否则必追究相关责任。转载请注明出处!!~~

原文地址:http://www.cnblogs.com/wodehao0808/p/3984869.html

时间: 2025-01-02 15:14:48

(原创)cocos2d-x 3.0+ lua 学习和工作(2) : 单一继承简单介绍的相关文章

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 返回指定表格中的所有键(key):table.keys

这里的函数主要用来做:返回指定表格中所有的键.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有键(key) -- example: local t = ( a = 1, b = 2, c = 3 ) local keys = table.keys( t ) -- keys = { "a", "b", "c" } -- @param t 要检查的表格(t表示是table) -- @param table

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(7): 其他table方法

看了下其他的table方法,好像没有什么好说的,注释里已经写的很明白了,这里就不罗嗦了~(小白:懒...).参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 返回指定表格中的所有值(value) -- example local t = { a = 1, b = 2, c = 3 } local values = table.values( t ) -- values = { 1, 2, 3 } -- @parame t 要检查的表格(t表示是table) -- @para

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(8): 生成只读table

这个函数的作用是:生成只读table. --[[ -- 生成只读table -- @param table t 需要不允许修改的table example: local tb = {"星期一", "星期二", "星期日"} local days = readOnly( tb ); days[2] = "星期三哪去了啊?" ; "[string \"Functions.lua\"]:466: 别修改

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(6): 合并表格:table.merge

这里的函数主要用来做:合并表格.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 将 来源表格 中所有键及值复制到 目标表格 对象中,如果存在同名键,则覆盖其值 -- example local tDest = { a = 1, b = 2 } local tSrc = { c = 3, d = 4 } table.merge( tDest, tSrc ) -- tDest = { a = 1, b = 2, c = 3, d = 4 } -- @param tDest 目

(原创) cocos2d-x 3.0+ lua 学习和工作(5) : table的remove的坑

本章主要讲下,table的remove,这个东西不注意就容易被坑(被坑的飘过~~~),当然,这里是针对数组table.即用ipairs方法遍历. 星月倾心贡献~~~ 看示例1:直接nil local tbl = { 1, 2, 3, 4, 5 } for k, v in ipairs( tbl ) do if v == 3 then tbl[k] = nil else print( "one: " .. k .. ":" .. v ) end end -- 再次输出

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(4): handler

这里的函数主要用来做:回调函数.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 将lua对象及方法包装为一个匿名函数 -- 许多功能需要传入一个 Lua 函数做参数,然后在特定事件发生时就会调用传入的函数.例如触摸事件.帧事件等等. -- example: local MyScene = class( "MyScene", function() ) return cc.Layer:create() end ) function MyScene:ctor() se

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 计算table元素个数:table.nums

这里的函数主要用来做:计算table元素个数.参考资料为quick_cocos. 星月倾心贡献~~~ 我们先看一段代码 local tbl = { [1] = 2, [2] = 2, [3] = 3 } print( "tbl length is " .. #tbl ) 这段代码是获得tbl的长度,即元素个数. 输出: tbl length is 3 拥有三个元素,没有问题.我们注意到元素的下标是,即key值是:1, 2, 3.即tbl[1], tbl[2], tbl[3].如果,我们

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(3): 深度克隆clone()

先上一段代码: local tbl = { ["a"] = 1, ["b"] = 2 } local cpy = tbl for k, v in pairs( tbl ) do print( "tab: " .. k .. ":".. v ) -- 打印tbl里的元素值 end for k, v in pairs( cpy ) do print( "cpy: " .. k .. ":".

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(2): 检查

这里的函数主要用来做:检查操作.参考资料为quick_cocos. 星月倾心贡献~~~ --[[ -- 检查并转换为数值,转换失败则返回 0 -- @param value 要检查并转换的值 -- @param base 进制,默认为十进制 -- @return number 返回的数值 --]] function checkNumber( value, base ) return tonumber( value, base ) or 0 end --[[ -- 检查并转换为布尔值, 除了nil