zoukankan      html  css  js  c++  java
  • class 函数

    cocos2d-x 3.3 lua 版本的class函数用法:
    1. local FightScene = class("FightScene", function()
    2. return cc.Layer:create()
    3. end)
    可以发现“继承”的不是基类,而是基类的create函数

    在这种情况下,FightScene创建对象的方式是:
    1. local sceneObj = FightScene.new()
    每个对象有一个“构造函数”ctor,在new的过程中调用,可以用来初始化成员

    那么“继承”在这种情况下是怎样实现的呢?
    原来new的时候,会先调用那个“继承”而来的函数,创建一个实例,再把FightScene的所有成员复制过去
    下面是class函数的部分代码:
    1. --Create an class.
    2. function class(classname, super)
    3. local superType = type(super)
    4. local cls
    5. if superType ~= "function" and superType ~= "table" then
    6. superType = nil
    7. super = nil
    8. end
    9. if superType == "function" or (super and super.__ctype == 1) then
    10. -- inherited from native C++ Object
    11. cls = {}
    12. if superType == "table" then
    13. -- copy fields from super
    14. for k,v in pairs(super) do cls[k] = v end
    15. cls.__create = super.__create
    16. cls.super = super
    17. else
    18. cls.__create = super
    19. end
    20. cls.ctor = function() end
    21. cls.__cname = classname
    22. cls.__ctype = 1
    23. function cls.new(...)
    24. -- 调用基类函数创建一个基类对象
    25. local instance = cls.__create(...)
    26. -- 增加本类的成员
    27. for k,v in pairs(cls) do instance[k] = v end
    28. instance.class = cls
    29.      -- 调用构造函数
    30. instance:ctor(...)
    31. return instance
    32. end
    33. else
    34. -- inherited from Lua Object
    35. if super then
    36. cls = clone(super)
    37. cls.super = super
    38. else
    39. cls = {ctor = function() end}
    40. end
    41. cls.__cname = classname
    42. cls.__ctype = 2 -- lua
    43. cls.__index = cls
    44. function cls.new(...)
    45. local instance = setmetatable({}, cls)
    46. instance.class = cls
    47. instance:ctor(...)
    48. return instance
    49. end
    50. end
    51. return cls
    52. end
    这样的定义有一个问题,就是类的“静态成员”会复制到每个对象中,虽然只是复制引用,但是也耗费了一些时间。




  • 相关阅读:
    我们用的信息系统安全吗?
    硬件代理服务器的日志分析方法
    Solarwinds Orion NPM实战视频演示
    网络资源管理系统LANsurveyor实战体验
    2013年,我的推荐博客汇总
    如何精准高效的实现视觉稿?------前端开发辅助工具AlloyDesigner使用介绍
    SVG如何做圆形图片
    canvas绘制一定数目的圆(均分)
    如何禁止火狐onblur时alert()产生类似选中的拖蓝效果
    ABCD多选正则表达式
  • 原文地址:https://www.cnblogs.com/dydx/p/4312505.html
Copyright © 2011-2022 走看看