--... cls.__index = cls ifnot cls.__supers or #cls.__supers == 1then setmetatable(cls, {__index = cls.super}) else setmetatable(cls, {__index = function(_, key) local supers = cls.__supers for i = 1, #supers do local super = supers[i] if super[key] thenreturn super[key] end end end}) end --... cls.new = function(...) local instance if cls.__create then instance = cls.__create(...) else instance = {} end setmetatableindex(instance, cls) instance.class = cls instance:ctor(...) return instance end ...
functionclass(classname, ...) local cls = {__cname = classname}
local supers = {...} for _, super inipairs(supers) do local superType = type(super) assert(superType == "nil"or superType == "table"or superType == "function", string.format("class() - create class \"%s\" with invalid super class type \"%s\"", classname, superType))
if superType == "function"then assert(cls.__create == nil, string.format("class() - create class \"%s\" with more than one creating function", classname)); cls.__create = super elseif superType == "table"then if super[".isclass"] then assert(cls.__create == nil, string.format("class() - create class \"%s\" with more than one creating function or native class", classname)); cls.__create = function()return super:create() end else cls.__supers = cls.__supers or {} cls.__supers[#cls.__supers + 1] = super ifnot cls.super then cls.super = super end end else error(string.format("class() - create class \"%s\" with invalid super type", classname), 0) end end
cls.__index = cls ifnot cls.__supers or #cls.__supers == 1then setmetatable(cls, {__index = cls.super}) else setmetatable(cls, {__index = function(_, key) local supers = cls.__supers for i = 1, #supers do local super = supers[i] if super[key] thenreturn super[key] end end end}) end
ifnot cls.ctor then cls.ctor = function()end end ---当创建一个类时,在__objects表中开辟一块空间存放对应的实例,此处需要注意的是,如果我们直接赋值为{},当我们用class方法创建一个名称相同的类时,会覆盖原来的表 __objects[cls.__cname] = __objects[cls.__cname] or {} cls.new = function(...) local instance if cls.__create then instance = cls.__create(...) else instance = {} end setmetatableindex(instance, cls) instance.class = cls instance:ctor(...) local clsContent = __objects[cls.__cname] ---在__objects中获取对应类的空间 clsContent[#clsContent + 1] = instance ---存放对象 return instance end cls.create = function(_, ...) return cls.new(...) end