首页 > 其他分享 >基于Lua实现类的继承

基于Lua实现类的继承

时间:2024-05-04 21:22:48浏览次数:18  
标签:基于 end 继承 self Lua print -- super class

-- 参考Lua官方给的代码
http://lua-users.org/wiki/ClassesAndMethodsExample

学习如何基于Lua脚本实现继承和面向对象的机制。

下面是测试代码。

-- object test.lua
require("INC_Class")

--===========================

local cAnimal = SETclass("Animal")


function cAnimal.methods:init(action, cutename)
	self.superaction = action
	self.supercutename = cutename
end

--==========================

local cTiger = SETclass("Tiger", cAnimal)

function cTiger.methods:init(cutename)
	self:init_super("HUNT (Tiger)", "Zoo Animal (Tiger)")
	self.action = "ROAR FOR ME!!"
	self.cutename = cutename
end

--==========================

Tiger1 = cAnimal:new("HUNT", "Zoo Animal")
Tiger2 = cTiger:new("Mr Grumpy")
Tiger3 = cTiger:new("Mr Hungry")

print("CLASSNAME FOR TIGER1 = ", Tiger1:classname())
print("CLASSNAME FOR TIGER2 = ", Tiger2:classname())
print("CLASSNAME FOR TIGER3 = ", Tiger3:classname())
print("===============")
print("SUPER ACTION", Tiger1.superaction)
print("SUPER CUTENAME", Tiger1.supercutename)
print("ACTION        ", Tiger1.action)
print("CUTENAME", Tiger1.cutename)
print("===============")
print("SUPER ACTION", Tiger2.superaction)
print("SUPER CUTENAME", Tiger2.supercutename)
print("ACTION        ", Tiger2.action)
print("CUTENAME", Tiger2.cutename)
print("===============")
print("SUPER ACTION", Tiger3.superaction)
print("SUPER CUTENAME", Tiger3.supercutename)
print("ACTION        ", Tiger3.action)
print("CUTENAME", Tiger3.cutename)

下面是INC_Class.lua文件,代码中的arg变量是需要手动定义的!

-- INC_Class.lua
-----------------------------------------------------
---- SETCLASS CLONES THE BASIC OBJECT CLASS TO CREATE NEW CLASSES
-----------------------------------------------------
-- Supports INHERITANCE
--
-- Sam Lie, 17 May 2004
-- Modified Code from Christian Lindig - lindig (at) cs.uni-sb.de
---------------------------------------------------------------

-- EVERYTHING INHERITS FROM THIS BASIC OBJECT CLASS
BaseObject = {
    super   = nil,
    name    = "Object",
    new     =
        function(class)
            local obj  = { class = class }
            local meta = {
                __index = function(self, key) return class.methods[key] end
            }
            setmetatable(obj, meta)
            return obj
        end,
    methods = { classname = function(self) return (self.class.name) end },
    data    = {}
}

function SETclass(name, super)
    if (super == nil) then
        super = BaseObject
    end

    local class = {
        super   = super,
        name    = name,
        new     =
            function(self, ...)
                local arg = { ... }

                local obj = super.new(self, "___CREATE_ONLY___");
                -- check if calling function init
                -- pass arguments into init function
                if (super.methods.init) then
                    obj.init_super = super.methods.init
                end

                if (self.methods.init) then
                    if (tostring(arg[1]) ~= "___CREATE_ONLY___") then
                        obj.init = self.methods.init
                        if obj.init then
                            obj:init(table.unpack(arg))
                        end
                    end
                end

                return obj
            end,
        methods = {}
    }

    -- if class slot unavailable, check super class
    -- if applied to argument, pass it to the class method new
    setmetatable(class, {
        __index = function(self, key) return self.super[key] end,
        __call  = function(self, ...) return self.new(self, table.unpack(arg)) end
    })

    -- if instance method unavailable, check method slot in super class
    setmetatable(class.methods, {
        __index = function(self, key) return class.super.methods[key] end
    })
    return class
end

标签:基于,end,继承,self,Lua,print,--,super,class
From: https://www.cnblogs.com/ckxkexing/p/18172708

相关文章

  • 文件包含-基于Pikachu的学习
    File_Include(文件包含)原理文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。比如在PHP中,提供了:include(),include_once()require(),require_once()这些文件包含函数,这些函数在代码设计中......
  • 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台
    1.项目介绍  基于.NETFramework4.8开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等应用场景,同时支持图像与视频检测。模型部署引擎使用的是OpenVINO™、TensorRT、ONNXruntime以及OpenCVDNN,支持CP......
  • 第?课——基于矩阵快速幂的递推解法
    第?课——基于矩阵快速幂的递推解法由于中间的数论部分我自己学的很差,没有办法写出清晰的博客来,所以这里跳过了数论部分的博客,来到矩阵快速幂。递推递推是一个非常常用的工具。比如经典的斐波那契数列:\[f(x)=\left\{\begin{array}{**lr**}1&,0\l......
  • 基于深度学习网络的鞋子种类识别matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      基于GoogLeNet深度学习网络的鞋子种类识别是一种利用深度卷积神经网络进行物体识别的方法,特别适用于大规模图像分类问题。GoogLeNet以其独特的Inception模块和高效的层级结构,在Imag......
  • 基于SSM的在线考试系统毕业设计论文【范文】
    摘要随着信息技术的飞速发展,网络教学逐渐成为教育行业的重要组成部分。在线考试系统作为网络教学平台的关键模块之一,其便捷性、高效性和公正性受到广泛关注,基于SSM框架的在线考试系统旨在提供一个稳定、可靠并且易于维护的在线考试环境,以满足现代教育评价的需求。本研究围绕在线......
  • eBPF基于LPM实现路由匹配
    基于eBPFlpmmap,icmp只有匹配上路由才能通。最终目录结构效果展示启动应用前,可以ping通192.168.0.1和192.168.0.105。启动应用后,无法ping通192.168.0.1,可以ping通192.168.0.105。停止应用后,可以ping通192.168.0.1和192.168.0.105。icmp/drop-icmp.c#include"../heade......
  • c++继承两个类怎么实现
    在C++中,继承两个类可以通过多重继承来实现。多重继承允许一个派生类从多个基类继承属性和方法。以下是一个继承两个类的示例:#include<iostream>//第一个基类classBase1{public:voidmethod1(){std::cout<<"Base1method1"<<std::endl;}};//......
  • BiTCN:基于卷积网络的多元时间序列预测
    在时间序列预测领域中,模型的体系结构通常依赖于多层感知器(MLP)或Transformer体系结构。基于mlp的模型,如N-HiTS,TiDE和TSMixer,可以在保持快速训练的同时获得非常好的预测性能。基于Transformer的模型,如PatchTST和ittransformer也取得了很好的性能,但需要更多的内存和时间来训练。......
  • C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑
    要在C#中搭建基于ISqlSugarClient的三层架构框架,你需要定义数据访问层(DAL)、业务逻辑层(BLL)和表现层(UI)。下面是一个完整的例子,涉及数据库仓储、业务逻辑层,以及依赖注入。这个例子基于ASP.NETCoreMVC构建,使用ISqlSugarClient来处理数据访问。这个例子中,我们将使用User作为一个简单......
  • SQL注入-基于Pikachu的学习
    zhSQL注入SQL数据库的基本语句SQL教程|菜鸟教程(runoob.com)史上最全SQL基础知识总结(理论+举例)-CSDN博客SQL注入原理SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分......