local function classT(className,...)
local cls = {}
cls.__className = className
cls.ctor = function (...)
--默认构造函数
end
cls.new = function (...)--------------------(4)
local instance = {}
setmetatable(instance,{__index=cls})
instance.__class = cls
instance:ctor(...)-----------------------(5)
return instance
end
cls.create = function (...)------------------(2)
return cls.new(...)----------------------(3)
end
return cls
end
local classAT = classT("classA")
function classAT:ctor(...)-----------------------(6)
self.name = ... -----------------------(7)
end
local classA_1T = classAT:create("secondParam")--(1)
详解如下:
–(1):调用时默认传入第一个参数self即classAT,第二个"secondParam"
–(2):但是函数声明的时候用的 . ,所以不会有默认隐藏的self去接收,此时传入参数为 classAT secondParam
–(3).调用,不会传入self,即参数为classAT secondParam
–(4).但是函数声明的时候用的 . ,所以不会有默认隐藏的self去接收,此时传入参数为 classAT secondParam
–(5):调用,会传入self即instance,所以传入参数instance classAT secondParam
–(6):声明,会有默认self接收instance,即传入参数为classAT secondParam
–(7)self.name = classAT secondParam,多个参数赋值一个变量,只赋值第一个,
即self=instance,self.name=instance.name=classAT
若将第(5)步变成instance.ctor(…),则
–(5):调用,不会传入self即instance,所以传入参数classAT secondParam
–(6):声明,会有默认self接收classAT,即传入参数为secondParam
–(7)self = classAT, self.name=classAT.name=secondParam
总结如下:
classAT:create(“secondParam”)这种:号调用,会默认传入self作为第一个参数,传入参数为classAT"secondParam"
cls.create = function (…)这种.号函数声明,没有默认self接收,将使得传入参数变成classAT “secondParam”
instance:ctor(…)这种:号调用,会默认传入self作为第一个参数,传入参数为instance classAT “secondParam”
function classAT:ctor(…)这种有默认self接收,将使得传入参数变为classAT"secondParam"