zoukankan      html  css  js  c++  java
  • (原创)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

  • 相关阅读:
    css3.0新属性效果在ie下的解决方案(兼容性)
    ajax实现md5加密
    ajax给全局变量赋值问题
    前端资源分享
    7件你不知道但可以用CSS做的事
    jQuery 常用效果
    ThinkPHP redirect 传参
    join和split 的使用
    JSON_FORCE_OBJECT 数字索引数组 强转对象
    layer 弹框不显示内容
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/3984869.html
Copyright © 2011-2022 走看看