面向对象
步骤
1: 定义一个类的表 后面作为 类的实例的元表:
2: 定义一个类的实例的表
3: 为这个实例的表加一个元表,并且元表的__index指向类的表
4:利用self机制,绑定实例对象。 当 表的实例:表的函数 的时候,隐式的帮我们传递了实例的表为self 到函数里面
-- lua是没有面向对象语法的,我们可以模拟 local base = {} --base的成员函数 function base:test() print("base:test", self) --此时的self对象为谁调用的就是谁 end function base:new(instant) if not instant then --如果没有实例 或者传过来的实例为空 instant = {} --那么就创建一个空表作为类的实例 end setmetatable(instant, {__index = self }) --self为谁调用的new就是谁 如果有实例 那么在实例的基础上扩展实例表 return instant end -- base叫做类的表 --做一个类的实例 local b = base:new() --此时new函数中的self对象是base -- 在new里面吧新创建的实例的表的元表变成了base print("b instance ==", b) --打印看下b的地址是否跟test中的self一致 b:test() --test中的self对象就是b --LUA: b instance == table: 0000017FA84AB150 --LUA: base:test table: 0000017FA84AB150
继承
1: 子类的表是父类的一个实例
2: 子类的表作为一个原型再new了一个表;
类的实实例-->元表-->子类的表-->元表-->父类的表;
3: 现在子类的实例找,找不到到元表找,元表找不到,到元表的元表找;
4: 子类重载父类的函数;
5: 子类调用父类的函数;
local test = {} -- lua是没有面向对象语法的,我们可以模拟 local base = {} --base的成员函数 function base:test() print("base:test", self) --此时的self对象为谁调用的就是谁 end function base:new(instant) if not instant then --如果没有实例 或者传过来的实例为空 instant = {} --那么就创建一个空表作为类的实例 end setmetatable(instant, {__index = self }) --self为谁调用的new就是谁 return instant end -- base叫做类的表 --做一个类的实例 local b = base:new() --此时new函数中的self对象是base -- 在new里面吧新创建的实例的表的元表变成了base print("b instance ==", b) --打印看下b的地址是否跟test中的self一致 b:test() --test中的self对象就是b --LUA: b instance == table: 0000017FA84AB150 --LUA: base:test table: 0000017FA84AB150 --继承 -- 基类 person -- 子类 男人 --基类的表 local person = {} function person:test() print("person:test", self) end function person:get_age() print("person:get_age", self) end function person:new(instant) if not instant then instant = {} end setmetatable(instant, {__index = self}) return instant end --子类的表 local man = person:new() function man:test_man() print("man:test_man", self) end function man:test_man2() print("man:test_man2") end --重载 function man:get_age() print("man:get_age", self) --如何调用基类的函数 person.get_age(self) end -- 为这个man类实例化一个类的表 local p = man:new() --man本身没有new 那么它就会去person类找new 同时把man作为new函数里面的self传进去作为p的元表 print("p==", p) --LUA: p== table: 0000017FB6C76170 p:test_man() --调用man里面的test_man LUA: man:test_man table: 0000017FB6C76170 p:test() --man里面找不到,则去P元表的元表person里面去找,然后调用 LUA: person:test table: 0000017FB6C76170 --调用重载函数 p:get_age() --p表没有,则去man里查找,查到到了 则不会再往上查找了 调用的就是子类的get_age man:get_age