前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >lua中的面向对象之继承

lua中的面向对象之继承

作者头像
keyle
发布2024-11-01 12:16:15
发布2024-11-01 12:16:15
6200
代码可运行
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作
运行总次数:0
代码可运行

阅读本文需求有一定的前置知识,比如什么是面向对象,这边就不再赘述,本文用几个简单的例子讲述下在lua语言环境下的面向对象。

创建基类

下面拆解下这个函数,下面这段代码定义在animal.lua文件中。其中实现了一个new函数,new函数默认没有对象会创建一个新表,并且将self作为这个新表的元方法。

代码语言:javascript
代码运行次数:0
复制
animal = {}
function animal:Talk(content)
    print("animal:Talk->" .. content)
end

function animal:new(obj)
    obj = obj == nil and {} or obj
    self.__index = self    --前面的self是指new参数列表中缺省的self,
    setmetatable(obj, self)
    return obj
end


return animal

创建子类Cat继承基类animal

代码语言:javascript
代码运行次数:0
复制
local anim = require("animal")
cat = anim:new()
-- cat.__index = cat    --可以这样设定当前的__index指向

function cat:CatTalk(content)
    print("cat:CatTalk->" .. content)
end

function cat:new(obj)
    obj = obj == nil and {} or obj

    -- setmetatable(obj, {__index = self})   
    -- 方法1. 将index__索引的目标指向当前文件,坏处是每次都要构建一张表

    self.__index = self  --可以这样设定当前的__index指向
    setmetatable(obj, self)
    --方法2. 将self直接作为obj的元表,如果出现找不到函数/字段会从当前文件中找。
    return obj
end


return cat

测试脚本

子类继承了基类的 Talk 函数,并且调用输出了自己的CatTalk函数。

代码语言:javascript
代码运行次数:0
复制
local cat = require("cat")
local c = cat:new()
c:Talk("hello world")
c:CatTalk("hello world")

--------输出------
PS D:\lua> lua .\test1.lua
animal:Talk->hello world
cat:CatTalk->hello world
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建基类
  • 创建子类Cat继承基类animal
  • 测试脚本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档