---新建一个对象 functionObject:__call(...) local obj = setmetatable({}, self) obj:new(...) return obj end
Object:new() 是一个空方法,子类可以重写它来实现自己的构造逻辑。
Object:__call(...) 使得 Object 可以像函数一样被调用来创建实例。它创建一个新的表,设置其元表为 Object,然后调用 new 方法进行初始化。
继承机制
1 2 3 4 5 6 7 8 9 10 11 12 13
functionObject:extend() local cls = {} -- 1. 复制父类的元方法 for k, v inpairs(self) do if k:find("__") == 1then cls[k] = v end end cls.__index = cls cls.super = self-- 记录父类 setmetatable(cls, self) -- 设置元表指向父类,实现方法继承 return cls end
元方法继承:通过复制父类的元方法(以 __ 开头的方法),确保子类也能使用这些特殊行为。
cls.super 记录父类,方便子类调用父类方法。
setmetatable(cls, self) 设置子类的元表为父类,实现方法继承。
混入(Mixin)功能
使用 implement 方法可以将多个类的功能混入当前类,增强代码复用性。
1 2 3 4 5 6 7 8 9
functionObject:implement(...) for _, cls inpairs({...}) do for k, v inpairs(cls) do ifself[k] == nilandtype(v) == "function"then self[k] = v -- 将函数拷贝到当前类 end end end end
implement 方法接受多个类作为参数,将它们的函数复制到当前类中,前提是当前类没有同名函数。
这使得我们可以轻松地将不同类的功能组合在一起,而不需要通过复杂的继承层次结构。
类型检查
1 2 3 4 5 6 7 8 9 10
functionObject:is(T) local mt = getmetatable(self) while mt do if mt == T then returntrue end mt = getmetatable(mt) -- 沿着元表链向上递归查找 end returnfalse end
is 方法用于检查当前对象是否是某个类的实例。它通过沿着元表链向上递归查找来判断对象的类型,支持多层继承关系。