Lua封装、继承

封装

  1. 使用表模拟封装
    Object={age=18}
  2. 构造函数
    function Object:new()
    local obj={}–新建的表作为本地变量
    setmetatable(obj,self)
    self.__index=self;–子表没有的属性或方法 可在元表中查找
    return obj
    end
  3. 成员方法
    function Object:Test()
    print(self.age)
    end
  4. 新建类(表)
    local obj=Object:new()
    print(obj.age) 18
    obj:Test() 18
  5. 注意:
    obj.age=14; 赋值相当于 子类添加了该属性 不去元表中查找
    print(obj.age) 14
    obj:Test() 14 冒号会将调用者作为函数的第一个参数 self关键字代表第一个参数

继承

  1. 构建继承方法
    function Object:subClass(className) --字符串
    _G[className]={} _G表 包含所有全局变量 键值对的形式存在
    local obj=_G[className]
    setmetatable(obj,self)
    self.__index=self

    obj.base=self–实现多态时候使用父类方法
    end
  2. 继承
    Object:subClass(“SubClass”) SubClass 继承Object
    local c1=SubClass:new() 实例化对象c1
    print(c1.age) --c1的元表SubClass SubClass的元表Object

多态

同名方法不同逻辑

  1. 构建父类
    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
  2. 子类
    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()
  3. 注意
    player作为参数传入Move函数
    self.posX+1 此时player无posX属性 访问GameObject的posX
    赋值时候 player添加了posX属性
    等号左侧是player的属性 ;右侧访问GameObject的属性
    self.posX=self.posX+1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值