封装
- 使用表模拟封装
Object={age=18} - 构造函数
function Object:new()
local obj={}–新建的表作为本地变量
setmetatable(obj,self)
self.__index=self;–子表没有的属性或方法 可在元表中查找
return obj
end - 成员方法
function Object:Test()
print(self.age)
end - 新建类(表)
local obj=Object:new()
print(obj.age) 18
obj:Test() 18 - 注意:
obj.age=14; 赋值相当于 子类添加了该属性 不去元表中查找
print(obj.age) 14
obj:Test() 14 冒号会将调用者作为函数的第一个参数 self关键字代表第一个参数
继承
- 构建继承方法
function Object:subClass(className) --字符串
_G[className]={} _G表 包含所有全局变量 键值对的形式存在
local obj=_G[className]
setmetatable(obj,self)
self.__index=self
obj.base=self–实现多态时候使用父类方法
end - 继承
Object:subClass(“SubClass”) SubClass 继承Object
local c1=SubClass:new() 实例化对象c1
print(c1.age) --c1的元表SubClass SubClass的元表Object
多态
同名方法不同逻辑
- 构建父类
Object:subClass(“GameObject”)
GameObject.posX=0
GameObject.posY=0
function GameObject:Move()
self.posX=self.posX+1
self.posY=self.posY+1
print(self.posX…","…self.posY)
end - 子类
GameObject:subClass(“Player”)
local player=Player:new()
player:Move()
重写Move方法
function Player:Move()
保留父类同名方法:继承的时候 子类定义一个属性 存储父类 obj.base=self
base是GameObject
执行父类逻辑 通过.调用 自己传入参数
self.base.Move(self)
end
player:Move() - 注意
player作为参数传入Move函数
self.posX+1 此时player无posX属性 访问GameObject的posX
赋值时候 player添加了posX属性
等号左侧是player的属性 ;右侧访问GameObject的属性
self.posX=self.posX+1