People = {}People.sayHi=function()print("Hi People!")end
或者可以这样:
functionPeople.sayHi()print("Hi People!")end
这就相当于创建了一个 People 类, 那怎么生成这个类的实例呢? 它的构造函数呢? 往下看:
People.new=function()local self = {}for key, var inpairs(People) do self[key] = varendreturn selfendlocal p1 = People.new()p1.sayHi()
我们还可以为这个类添加带参数的构造函数:
People.new=function(name)local self = {} self.name = name;for key, var inpairs(People) do self[key] = varendreturn selfendlocal p2 = People.new("李四")print(p2.name)
现在, 我们类可以通过 new() 方法来实例化了.
新问题是, 我们都知道, C++ 类有个 this 指针, 这点, 又要怎么实现呢? 可以借助 Lua 的王法糖 (冒号):
People.sayHello=function(this)print(this.name .." Say Hello!")endlocal p3 = People.new("張三")p3:sayHello()
this 指针現在也有了, 那 C++ 类可以继承, Lua 中又怎么实现呢?
Man = {}Man.new=function(this)local self = People.new()for key, var inpairs(Man) do self[key] = varendreturn selfend
这里先生成一个 People "对象", 然后把这个对象 Key 对应的 value 替换成 Man 中 Key 对应的 value, 这样的话, 如果 Man 中没有 "重写" People 中的方法, 那么, 返回的 self 中的方法还是为 People 中的方法, 如果 "重写" 了 People 中的方法, 因为做了替换操作, 所以返回的 self 中的方法其实是对应的 Man 中的方法.