首页 > 其他分享 >Lua实现链表(面向对象应用)

Lua实现链表(面向对象应用)

时间:2024-07-01 22:59:56浏览次数:3  
标签:function end 面向对象 self 链表 Lua new local curNode

Lua实现面向对象

面向对象核心三要素

1.封装:对一个事物的抽象为一些属性和行为动作的集合,封装将属性和行为动作(操作数据的方法)绑定在一起,并隐藏对象的内部实现细节,只暴露给外部部分接口。
2. 继承是一种机制,允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码重用和扩展。
3. 多态允许一个接口或方法在不同类的实例上有不同的表现形式。通过多态,可以编写更通用、更灵活的代码。

Lua面向对象大致原理

在 Lua 中,面向对象编程(OOP)的概念是通过表(table)和元表(metatable)来实现的。Lua 并没有内建的类系统,但通过灵活的元表机制,可以实现类、继承和多态等 OOP 特性。

面向对象示例

-- 下面通过实现一个简易的链表功能,来展示Lua实现面向对象的大致过程
local Node = {}
Node.__index = Node
Node.new = function(value)
    return setmetatable({value = value,next = nil},Node)
end

local LinkList = {}
LinkList.__index = LinkList
LinkList.new = function()
    return setmetatable({head = nil},LinkList)
end
function LinkList:Insert(value)
    local node = Node.new(value)
    if not self.head then
        self.head = node
    else
        local curNode = self.head
        while curNode.next do
            curNode = curNode.next
        end
        curNode.next = node
    end
end

function LinkList:InsertByTable(valuetbl)
    for k,v in ipairs(valuetbl) do
        local node = Node.new(v)
        if not self.head then
            self.head = node
        else
            local curNode = self.head
            while curNode.next do
                curNode = curNode.next
            end
            curNode.next = node
        end
    end
end

function LinkList:Print()
    if not self.head then
        print("List has no node")
    else
        local curNode = self.head
        while curNode do
            print("Cur Node Value:",curNode.value)
            curNode = curNode.next
        end
    end
end

function LinkList:Reverse()
    if not self.head then
        print("List has no node")
    else
        local preNode = nil
        local curNode = self.head
        while curNode do
            local nextNode = curNode.next
            curNode.next = preNode
            preNode = curNode
            curNode = nextNode
        end
        self.head = preNode
    end
end

local l = LinkList.new()
--l:Insert(2)
--l:Insert(4)
--l:Insert(5)
--l:Insert(1)
--l:Insert(0)
l:InsertByTable({1,2,3,4,"a"})
l:Print()
print("---------------------")
l:Reverse()
l:Print()

继承与多态示例

-- 定义一个基类
local Shape = {}
Shape.__index = Shape

function Shape:new()
    local instance = setmetatable({}, self)
    return instance
end

function Shape:area()
    return 0
end

-- 定义一个子类,继承自 Shape
local Rectangle = setmetatable({}, Shape)
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = Shape.new(self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:area()
    return self.width * self.height
end

-- 定义另一个子类,继承自 Shape
local Circle = setmetatable({}, Shape)
Circle.__index = Circle

function Circle:new(radius)
    local instance = Shape.new(self)
    instance.radius = radius
    return instance
end

function Circle:area()
    return math.pi * self.radius ^ 2
end

-- 创建子类的实例,并展示多态行为
local shapes = {Rectangle:new(3, 4), Circle:new(5)}

for _, shape in ipairs(shapes) do
    print("Area:", shape:area())  -- 分别输出矩形和圆的面积
end

标签:function,end,面向对象,self,链表,Lua,new,local,curNode
From: https://blog.csdn.net/lzh824359508/article/details/140024519

相关文章

  • xlua 原理浅析(Wrap文件形式)
    对xluaCSharpCallLua和LuaCallCSharp以Wrap文件注册形式的大致流程梳理。废话不多说,我们要提出两个问题C#是如何调用lua的lua是如何调用C#的前置知识资料lua参考手册https://cloudwu.github.io/lua53doc/manual.htmlxluahttps://github.com/Tencent/xLuaxlua源码......
  • 【剑指offer】JZ22-链表中倒数第k个节点-Python解法
    1.题目描述2.解题思路(Python版)方法一:遍历两次思路:1.首先计算链表的长度L;2.第二次开始从头依次遍历,找到链表的第(L-k+1)个节点,即为所找的节点。参考代码:#classListNode:#def__init__(self,x):#self.val=x#self.next=None##代码中的......
  • 全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装
    全网最适合入门的面向对象编程教程:06类和对象的Python实现-自定义类的数据封装摘要:本文我们主要介绍了数据封装的基本概念和特性,如何设置自定义类的私有属性和私有方法,protect属性的概念和特点。往期推荐:学嵌入式的你,还不会面向对象??!全网最适合入门的面向对象编程教程:00......
  • 力扣-61. 旋转链表
    1.题目介绍题目地址(61.旋转链表-力扣(LeetCode))https://leetcode.cn/problems/rotate-list/题目描述给你一个链表的头节点head,旋转链表,将链表每个节点向右移动 k 个位置。 示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=......
  • leetCode.92. 反转链表 II
    leetCode.92.反转链表II题目思路代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNod......
  • 对前端js高级面向对象的理解? 如何理解前端js中的内置对象、 对象原型、原型链?
    对象前言对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)对象是javascript中的一个重要的概念,甚至有“JavaScript中万物皆是对象”的说法。首先看面向对象 面向对象编程将一个系统抽象为许多对象的集合,每一个对象代表了这个系......
  • PHP 面向对象编程(OOP)入门指南
    面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程范式,通过使用对象来设计和组织代码。PHP作为一种广泛使用的服务器端脚本语言,支持面向对象编程。本文将介绍PHP面向对象编程的基本概念和用法,并提供示例代码帮助理解。一、面向对象编程的基本概念1.1类和对象......
  • C++ 面向对象高级开发 5、操作符重载与临时对象
    C++里面操作符就是一种函数。 任何成员函数都有一个this->pointer谁调用这个函数,就指向谁。      tempobject(临时对象)typename(); 没有名称即是临时对象。一般人少用,但标准库用的很多。   质疑精神,即使是标准库也有可以提高的地方。 ......
  • 链表实现队列
    #include<iostream>#include<stdexcept>//定义链表节点结构structNode{intdata;Node*next;};//链表队列类classLinkedListQueue{private:Node*front;//队头指针Node*rear;//队尾指针public://构造函数,初始化队头和队尾指针......
  • 数组和链表-《算法图解》学习
    内存工作原理需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它们的差别很重要。接下来介绍数组和链表以及它们的优缺点。 ==============tobeconntinued......