class.lua 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. function __is_kind_of(c,T)
  2. local __baseclass = getmetatable(c)
  3. while __baseclass do
  4. if __baseclass.__classname == T.__classname then
  5. return true
  6. end
  7. __baseclass = __baseclass.__baseclass
  8. end
  9. return false
  10. end
  11. function __is_class(c, T)
  12. return (c.__classname == T.__classname)
  13. end
  14. function class(name)
  15. local cls = {}
  16. cls.__classname = name
  17. cls.__tostring = function(c)
  18. return "Class of type "..c.__classname
  19. end
  20. cls.__newindex = function(t,k,v)
  21. retVal = false
  22. if t["__setvar"] ~= nil then
  23. retVal = t["__setvar"](t,k,v)
  24. end
  25. if retVal == false then
  26. rawset(t,k,v)
  27. end
  28. end
  29. cls.isKindOfClass = __is_kind_of
  30. cls.isClass = __is_class
  31. cls.__index = function(t,k)
  32. local prototype = rawget(t,"__prototype")
  33. if prototype ~= nil then
  34. ret = rawget(prototype,k)
  35. if ret ~= nil then return ret end
  36. end
  37. if k ~= "__index" and k ~= "__getvar" then
  38. if t["__getvar"] ~= nil then
  39. local ret = t["__getvar"](t,k)
  40. if ret ~= nil then return ret end
  41. end
  42. return rawget(t,k)
  43. end
  44. end
  45. _G[name] = setmetatable(cls, {
  46. __call = function (c, ...)
  47. local instance = setmetatable({}, cls)
  48. instance.__prototype = cls
  49. if cls[name] then
  50. cls[name](instance, ...)
  51. end
  52. return instance
  53. end})
  54. return function(superclass)
  55. if type(superclass) == 'table' then
  56. cls[superclass.__classname] = {}
  57. setmetatable(cls[superclass.__classname], superclass)
  58. for i,v in pairs(superclass) do
  59. if cls[i] == nil then
  60. cls[i] = v
  61. else
  62. cls[superclass.__classname][i] = v
  63. end
  64. end
  65. cls.__baseclass = superclass
  66. end
  67. end
  68. end