Lua类的实现

来源:互联网 发布:淘宝怎么联系客服啊 编辑:程序博客网 时间:2024/05/21 14:52

详细参见:lua class wiki和lua class github

-- class.lua-- Compatible with Lua 5.1 (not 5.0).function class(base, init)   local c = {}    -- a new class instance   if not init and type(base) == 'function' then      init = base      base = nil   elseif type(base) == 'table' then    -- our new class is a shallow copy of the base class!      for i,v in pairs(base) do         c[i] = v      end      c._base = base   end   -- the class will be the metatable for all its objects,   -- and they will look up their methods in it.   c.__index = c   -- expose a constructor which can be called by <classname>(<args>)   local mt = {}   mt.__call = function(class_tbl, ...)   local obj = {}   setmetatable(obj,c)   if init then      init(obj,...)   else       -- make sure that any stuff from the base class is initialized!      if base and base.init then      base.init(obj, ...)      end   end   return obj   end   c.init = init   c.is_a = function(self, klass)      local m = getmetatable(self)      while m do          if m == klass then return true end         m = m._base      end      return false   end   setmetatable(c, mt)   return cend


require 'class'Animal = class(function(a,name)   a.name = nameend)function Animal:__tostring()  return self.name..': '..self:speak()endDog = class(Animal)function Dog:speak()  return 'bark'endCat = class(Animal, function(c,name,breed)         Animal.init(c,name)  -- must init base!         c.breed = breed      end)function Cat:speak()  return 'meow'endLion = class(Cat)function Lion:speak()  return 'roar'endfido = Dog('Fido')felix = Cat('Felix','Tabby')leo = Lion('Leo','African')D:\Downloads\func>lua -i animal.lua> = fido,felix,leoFido: bark      Felix: meow     Leo: roar> = leo:is_a(Animal)true> = leo:is_a(Dog)false> = leo:is_a(Cat)true



0 0