class_Tips.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. local function call(t, ...)
  2. local o = {}
  3. --不支持子类中有自定义的get或者set,这里的t相当于c。比如PlayerData,减少__index函数的调用
  4. t.__getterse = t.__getterse
  5. t.__setterse = t.__setterse
  6. setmetatable(o, t)
  7. if o.ctor then
  8. o:ctor(...)
  9. end
  10. return o
  11. end
  12. function class(...)
  13. local c = {}
  14. local m = {}
  15. -- 构造函数
  16. --m.__call = call
  17. m.__call = function(t, ...)
  18. --if t.ctorCall then
  19. -- return t.ctorCall(t,...)
  20. --else
  21. -- local o = {}
  22. -- --不支持子类中有自定义的get或者set,这里的t相当于c。比如PlayerData,减少__index函数的调用
  23. -- t.__getterse = t.__getterse
  24. -- t.__setterse = t.__setterse
  25. -- setmetatable(o, t)
  26. -- if o.ctor then
  27. -- o:ctor(...)
  28. -- end
  29. -- return o
  30. --end
  31. local o = {}
  32. --不支持子类中有自定义的get或者set,这里的t相当于c。比如PlayerData,减少__index函数的调用
  33. t.__getterse = t.__getterse
  34. t.__setterse = t.__setterse
  35. setmetatable(o, t)
  36. if o.ctor then
  37. o:ctor(...)
  38. end
  39. return o
  40. end
  41. -- 多重继承
  42. local isMutilBases = false
  43. c.__bases = {...}
  44. if #c.__bases>=3 then
  45. if type(c.__bases[#c.__bases]) == 'boolean' and type(c.__bases[#c.__bases-1]) == 'boolean' and
  46. type(c.__bases[#c.__bases-2]) == 'boolean' then
  47. isMutilBases = c.__bases[#c.__bases] == true
  48. c.__bases[#c.__bases] = nil
  49. c.isClassInternalSet = c.__bases[#c.__bases] == true
  50. c.__bases[#c.__bases] = nil
  51. c.isClassInternalGet = c.__bases[#c.__bases] == true
  52. c.__bases[#c.__bases] = nil
  53. end
  54. end
  55. if isMutilBases then
  56. if #c.__bases>0 then
  57. m.__index = function(t, k)
  58. for _, base in ipairs(t.__bases) do
  59. local v = base[k]
  60. if v then
  61. return v
  62. end
  63. end
  64. end
  65. end
  66. else
  67. if #c.__bases > 0 then
  68. m.__index = c.__bases[1]
  69. end
  70. end
  71. setmetatable(c, m)
  72. if not c.isClassInternalGet and not c.isClassInternalSet then
  73. c.__index = c
  74. else
  75. if c.isClassInternalGet then
  76. -- 查找访问器
  77. --c.__gettere = function (t, k)
  78. -- local getters = rawget(t, "__getterse")
  79. -- local v = getters and getters[k]
  80. -- if v then
  81. -- return v
  82. -- end
  83. --
  84. -- for _, base in ipairs(t.__bases) do
  85. -- v = base.__gettere and base:__gettere(k)
  86. -- if v then
  87. -- --rawset(t,"__getterse",base.__getterse)
  88. -- return v
  89. -- end
  90. -- end
  91. --end
  92. c.__index = function (t, k)
  93. local v = c[k]
  94. if v then
  95. return v
  96. end
  97. v = c['__getterse']
  98. local gettere = v[k]
  99. if gettere then
  100. return gettere(t)
  101. end
  102. --gettere =c.__gettere and c:__gettere(k)
  103. --if gettere then
  104. -- return gettere(t)
  105. --end
  106. end
  107. else
  108. c.__index = c
  109. end
  110. if c.isClassInternalSet then
  111. -- 查找设置器
  112. --c.__settere = function (t, k)
  113. -- local setters = rawget(t, "__setterse")
  114. -- local v = setters and setters[k]
  115. -- if v then
  116. -- return v
  117. -- end
  118. --
  119. -- for _, base in ipairs(t.__bases) do
  120. -- v = base.__settere and base:__settere(k)
  121. -- if v then
  122. -- --rawset(t,"__setterse",base.__setterse)
  123. -- return v
  124. -- end
  125. -- end
  126. --end
  127. c.__newindex = function (t, k, v)
  128. local s = c['__setterse']
  129. local settere = s[k]
  130. if settere then
  131. settere(t,v)
  132. return
  133. end
  134. rawset(t, k, v)
  135. --settere = c.__settere and c:__settere(k)
  136. --if settere then
  137. -- settere(t, v)
  138. --else
  139. -- rawset(t, k, v)
  140. --end
  141. end
  142. else
  143. end
  144. end
  145. return c
  146. end
  147. local GetSetParam = { isClassInternalGet = false, isClassInternalSet = false,initCacheCount = 0}
  148. function FillGetSetParam(isClassInternalGet,isClassInternalSet,isMutilBases)
  149. --GetSetParam.isClassInternalGet = isClassInternalGet
  150. --GetSetParam.isClassInternalSet = isClassInternalSet
  151. --GetSetParam.initCacheCount = initCacheCount
  152. --return GetSetParam
  153. if isMutilBases == nil then
  154. isMutilBases = false
  155. end
  156. return isClassInternalGet,isClassInternalSet,isMutilBases
  157. end